Init
This commit is contained in:
+93
@@ -0,0 +1,93 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const phoenix_1 = require("@supabase/phoenix");
|
||||
class PresenceAdapter {
|
||||
constructor(channel, opts) {
|
||||
const phoenixOptions = phoenixPresenceOptions(opts);
|
||||
this.presence = new phoenix_1.Presence(channel.getChannel(), phoenixOptions);
|
||||
this.presence.onJoin((key, currentPresence, newPresence) => {
|
||||
const onJoinPayload = PresenceAdapter.onJoinPayload(key, currentPresence, newPresence);
|
||||
channel.getChannel().trigger('presence', onJoinPayload);
|
||||
});
|
||||
this.presence.onLeave((key, currentPresence, leftPresence) => {
|
||||
const onLeavePayload = PresenceAdapter.onLeavePayload(key, currentPresence, leftPresence);
|
||||
channel.getChannel().trigger('presence', onLeavePayload);
|
||||
});
|
||||
this.presence.onSync(() => {
|
||||
channel.getChannel().trigger('presence', { event: 'sync' });
|
||||
});
|
||||
}
|
||||
get state() {
|
||||
return PresenceAdapter.transformState(this.presence.state);
|
||||
}
|
||||
/**
|
||||
* @private
|
||||
* Remove 'metas' key
|
||||
* Change 'phx_ref' to 'presence_ref'
|
||||
* Remove 'phx_ref' and 'phx_ref_prev'
|
||||
*
|
||||
* @example Transform state
|
||||
* // returns {
|
||||
* abc123: [
|
||||
* { presence_ref: '2', user_id: 1 },
|
||||
* { presence_ref: '3', user_id: 2 }
|
||||
* ]
|
||||
* }
|
||||
* RealtimePresence.transformState({
|
||||
* abc123: {
|
||||
* metas: [
|
||||
* { phx_ref: '2', phx_ref_prev: '1' user_id: 1 },
|
||||
* { phx_ref: '3', user_id: 2 }
|
||||
* ]
|
||||
* }
|
||||
* })
|
||||
*
|
||||
*/
|
||||
static transformState(state) {
|
||||
state = cloneState(state);
|
||||
return Object.getOwnPropertyNames(state).reduce((newState, key) => {
|
||||
const presences = state[key];
|
||||
newState[key] = transformState(presences);
|
||||
return newState;
|
||||
}, {});
|
||||
}
|
||||
static onJoinPayload(key, currentPresence, newPresence) {
|
||||
const currentPresences = parseCurrentPresences(currentPresence);
|
||||
const newPresences = transformState(newPresence);
|
||||
return {
|
||||
event: 'join',
|
||||
key,
|
||||
currentPresences,
|
||||
newPresences,
|
||||
};
|
||||
}
|
||||
static onLeavePayload(key, currentPresence, leftPresence) {
|
||||
const currentPresences = parseCurrentPresences(currentPresence);
|
||||
const leftPresences = transformState(leftPresence);
|
||||
return {
|
||||
event: 'leave',
|
||||
key,
|
||||
currentPresences,
|
||||
leftPresences,
|
||||
};
|
||||
}
|
||||
}
|
||||
exports.default = PresenceAdapter;
|
||||
function transformState(presences) {
|
||||
return presences.metas.map((presence) => {
|
||||
presence['presence_ref'] = presence['phx_ref'];
|
||||
delete presence['phx_ref'];
|
||||
delete presence['phx_ref_prev'];
|
||||
return presence;
|
||||
});
|
||||
}
|
||||
function cloneState(state) {
|
||||
return JSON.parse(JSON.stringify(state));
|
||||
}
|
||||
function phoenixPresenceOptions(opts) {
|
||||
return (opts === null || opts === void 0 ? void 0 : opts.events) && { events: opts.events };
|
||||
}
|
||||
function parseCurrentPresences(currentPresences) {
|
||||
return (currentPresences === null || currentPresences === void 0 ? void 0 : currentPresences.metas) ? transformState(currentPresences) : [];
|
||||
}
|
||||
//# sourceMappingURL=presenceAdapter.js.map
|
||||
Reference in New Issue
Block a user