@river-build/sdk
Version:
For more details, visit the following resources:
154 lines • 6.27 kB
JavaScript
import { MembershipOp, } from '@river-build/proto';
import { StreamStateView_AbstractContent } from './streamStateView_AbstractContent';
import { bin_toHexString, check } from '@river-build/dlog';
import { logNever } from './check';
import { streamIdFromBytes } from './id';
import { utils } from 'ethers';
export class StreamStateView_User extends StreamStateView_AbstractContent {
streamId;
streamMemberships = {};
tipsSent = {};
tipsReceived = {};
constructor(streamId) {
super();
this.streamId = streamId;
}
applySnapshot(snapshot, content, encryptionEmitter) {
// initialize memberships
for (const payload of content.memberships) {
this.addUserPayload_userMembership(payload, encryptionEmitter);
}
this.tipsSent = { ...content.tipsSent };
this.tipsReceived = { ...content.tipsReceived };
}
prependEvent(event, _cleartext, _encryptionEmitter, _stateEmitter) {
check(event.remoteEvent.event.payload.case === 'userPayload');
const payload = event.remoteEvent.event.payload.value;
switch (payload.content.case) {
case 'inception':
break;
case 'userMembership':
// memberships are handled in the snapshot
break;
case 'userMembershipAction':
break;
case 'blockchainTransaction':
break;
case 'receivedBlockchainTransaction':
break;
case undefined:
break;
default:
logNever(payload.content);
}
}
appendEvent(event, cleartext, _encryptionEmitter, stateEmitter) {
check(event.remoteEvent.event.payload.case === 'userPayload');
const payload = event.remoteEvent.event.payload.value;
switch (payload.content.case) {
case 'inception':
break;
case 'userMembership':
this.addUserPayload_userMembership(payload.content.value, stateEmitter);
break;
case 'userMembershipAction':
break;
case 'blockchainTransaction': {
const transactionContent = payload.content.value.content;
switch (transactionContent?.case) {
case undefined:
break;
case 'tip': {
const event = transactionContent.value.event;
if (!event) {
return;
}
const currency = utils.getAddress(bin_toHexString(event.currency));
this.tipsSent[currency] = this.tipsSent[currency] ?? 0n + event.amount;
stateEmitter?.emit('userTipSent', this.streamId, currency, event.amount);
break;
}
case 'tokenTransfer':
break;
case 'spaceReview': {
// user left a review on a space
break;
}
default:
logNever(transactionContent);
break;
}
break;
}
case 'receivedBlockchainTransaction': {
const transactionContent = payload.content.value.transaction?.content;
switch (transactionContent?.case) {
case undefined:
break;
case 'tip': {
const event = transactionContent.value.event;
if (!event) {
return;
}
const currency = utils.getAddress(bin_toHexString(event.currency));
this.tipsReceived[currency] =
this.tipsReceived[currency] ?? 0n + event.amount;
stateEmitter?.emit('userTipReceived', this.streamId, currency, event.amount);
break;
}
case 'tokenTransfer':
break;
case 'spaceReview': {
// user left a review on a space
break;
}
default:
logNever(transactionContent);
break;
}
break;
}
case undefined:
break;
default:
logNever(payload.content);
}
}
addUserPayload_userMembership(payload, emitter) {
const { op, streamId: inStreamId } = payload;
const streamId = streamIdFromBytes(inStreamId);
const wasInvited = this.streamMemberships[streamId]?.op === MembershipOp.SO_INVITE;
const wasJoined = this.streamMemberships[streamId]?.op === MembershipOp.SO_JOIN;
this.streamMemberships[streamId] = payload;
switch (op) {
case MembershipOp.SO_INVITE:
emitter?.emit('userInvitedToStream', streamId);
emitter?.emit('userStreamMembershipChanged', streamId, payload);
break;
case MembershipOp.SO_JOIN:
emitter?.emit('userJoinedStream', streamId);
emitter?.emit('userStreamMembershipChanged', streamId, payload);
break;
case MembershipOp.SO_LEAVE:
if (wasInvited || wasJoined) {
emitter?.emit('userLeftStream', streamId);
emitter?.emit('userStreamMembershipChanged', streamId, payload);
}
break;
case MembershipOp.SO_UNSPECIFIED:
break;
default:
logNever(op);
}
}
getMembership(streamId) {
return this.streamMemberships[streamId];
}
isMember(streamId, membership) {
return this.getMembership(streamId)?.op === membership;
}
isJoined(streamId) {
return this.isMember(streamId, MembershipOp.SO_JOIN);
}
}
//# sourceMappingURL=streamStateView_User.js.map