@river-build/sdk
Version:
For more details, visit the following resources:
117 lines • 4.55 kB
JavaScript
import { MembershipOp } from '@river-build/proto';
import { logNever } from './check';
export class StreamStateView_Members_Membership {
streamId;
joinedUsers = new Set();
invitedUsers = new Set();
leftUsers = new Set();
pendingJoinedUsers = new Set();
pendingInvitedUsers = new Set();
pendingLeftUsers = new Set();
pendingMembershipEvents = new Map();
constructor(streamId) {
this.streamId = streamId;
}
/**
* If no userId is provided, checks current user
*/
isMemberJoined(userId) {
return this.joinedUsers.has(userId);
}
/**
* If no userId is provided, checks current user
*/
isMember(membership, userId) {
switch (membership) {
case MembershipOp.SO_INVITE:
return this.invitedUsers.has(userId);
case MembershipOp.SO_JOIN:
return this.joinedUsers.has(userId);
case MembershipOp.SO_LEAVE:
return !this.invitedUsers.has(userId) && !this.joinedUsers.has(userId);
case MembershipOp.SO_UNSPECIFIED:
return false;
default:
logNever(membership);
return false;
}
}
info(userId) {
const isJoined = this.joinedUsers.has(userId);
if (isJoined)
return MembershipOp.SO_JOIN;
const isInvited = this.invitedUsers.has(userId);
if (isInvited)
return MembershipOp.SO_INVITE;
const hasLeft = this.leftUsers.has(userId);
if (hasLeft)
return MembershipOp.SO_LEAVE;
return MembershipOp.SO_UNSPECIFIED;
}
participants() {
return new Set([...this.joinedUsers, ...this.invitedUsers, ...this.leftUsers]);
}
joinedParticipants() {
return this.joinedUsers;
}
joinedOrInvitedParticipants() {
return new Set([...this.joinedUsers, ...this.invitedUsers]);
}
applyMembershipEvent(userId, op, type, stateEmitter) {
switch (op) {
case MembershipOp.SO_INVITE:
if (type === 'confirmed') {
this.pendingInvitedUsers.delete(userId);
if (this.invitedUsers.add(userId)) {
stateEmitter?.emit('streamNewUserInvited', this.streamId, userId);
this.emitMembershipChange(userId, stateEmitter, this.streamId);
}
}
else {
if (this.pendingInvitedUsers.add(userId)) {
stateEmitter?.emit('streamPendingMembershipUpdated', this.streamId, userId);
}
}
break;
case MembershipOp.SO_JOIN:
if (type === 'confirmed') {
this.pendingJoinedUsers.delete(userId);
if (this.joinedUsers.add(userId)) {
stateEmitter?.emit('streamNewUserJoined', this.streamId, userId);
this.emitMembershipChange(userId, stateEmitter, this.streamId);
}
}
else {
if (this.pendingJoinedUsers.add(userId)) {
stateEmitter?.emit('streamPendingMembershipUpdated', this.streamId, userId);
}
}
break;
case MembershipOp.SO_LEAVE:
if (type === 'confirmed') {
const wasJoined = this.joinedUsers.delete(userId);
const wasInvited = this.invitedUsers.delete(userId);
this.pendingLeftUsers.delete(userId);
this.leftUsers.add(userId);
if (wasJoined || wasInvited) {
stateEmitter?.emit('streamUserLeft', this.streamId, userId);
this.emitMembershipChange(userId, stateEmitter, this.streamId);
}
}
else {
if (this.pendingLeftUsers.add(userId)) {
stateEmitter?.emit('streamPendingMembershipUpdated', this.streamId, userId);
}
}
break;
case MembershipOp.SO_UNSPECIFIED:
break;
default:
logNever(op);
}
}
emitMembershipChange(userId, stateEmitter, streamId) {
stateEmitter?.emit('streamMembershipUpdated', streamId, userId);
}
}
//# sourceMappingURL=streamStateView_Members_Membership.js.map