UNPKG

@river-build/sdk

Version:

For more details, visit the following resources:

112 lines 4.45 kB
import { FullyReadMarkersSchema, UserSettingsPayload_Snapshot_UserBlocks_BlockSchema, UserSettingsPayload_Snapshot_UserBlocksSchema, } from '@river-build/proto'; import { check, dlog } from '@river-build/dlog'; import { logNever } from './check'; import { StreamStateView_AbstractContent } from './streamStateView_AbstractContent'; import { create, fromJsonString } from '@bufbuild/protobuf'; import { streamIdFromBytes, userIdFromAddress } from './id'; const log = dlog('csb:stream'); export class StreamStateView_UserSettings extends StreamStateView_AbstractContent { streamId; settings = new Map(); fullyReadMarkersSrc = new Map(); fullyReadMarkers = new Map(); userBlocks = {}; constructor(streamId) { super(); this.streamId = streamId; } applySnapshot(snapshot, content) { // iterate over content.fullyReadMarkers for (const payload of content.fullyReadMarkers) { this.fullyReadMarkerUpdate(payload); } for (const userBlocks of content.userBlocksList) { const userId = userIdFromAddress(userBlocks.userId); this.userBlocks[userId] = userBlocks; } } prependEvent(event, _cleartext, _encryptionEmitter, _stateEmitter) { check(event.remoteEvent.event.payload.case === 'userSettingsPayload'); const payload = event.remoteEvent.event.payload.value; switch (payload.content.case) { case 'inception': break; case 'fullyReadMarkers': // handled in snapshot break; case 'userBlock': // handled in snapshot break; case undefined: break; default: logNever(payload.content); } } appendEvent(event, _cleartext, _encryptionEmitter, stateEmitter) { check(event.remoteEvent.event.payload.case === 'userSettingsPayload'); const payload = event.remoteEvent.event.payload.value; switch (payload.content.case) { case 'inception': break; case 'fullyReadMarkers': this.fullyReadMarkerUpdate(payload.content.value, stateEmitter); break; case 'userBlock': this.userBlockUpdate(payload.content.value, stateEmitter); break; case undefined: break; default: logNever(payload.content); } } fullyReadMarkerUpdate(payload, emitter) { const { content } = payload; log('$ fullyReadMarkerUpdate', { content }); if (content === undefined) { log('$ Content with FullyReadMarkers is undefined'); return; } const streamId = streamIdFromBytes(payload.streamId); this.fullyReadMarkersSrc.set(streamId, content); const fullyReadMarkersContent = fromJsonString(FullyReadMarkersSchema, content.data); this.fullyReadMarkers.set(streamId, fullyReadMarkersContent.markers); emitter?.emit('fullyReadMarkersUpdated', streamId, fullyReadMarkersContent.markers); } userBlockUpdate(payload, emitter) { const userId = userIdFromAddress(payload.userId); if (!this.userBlocks[userId]) { this.userBlocks[userId] = create(UserSettingsPayload_Snapshot_UserBlocksSchema, {}); } this.userBlocks[userId].blocks.push(create(UserSettingsPayload_Snapshot_UserBlocks_BlockSchema, { eventNum: payload.eventNum, isBlocked: payload.isBlocked, })); emitter?.emit('userBlockUpdated', payload); } isUserBlocked(userId) { const latestBlock = this.getLastBlock(userId); if (latestBlock === undefined) { return false; } return latestBlock.isBlocked; } isUserBlockedAt(userId, eventNum) { let isBlocked = false; for (const block of this.userBlocks[userId]?.blocks ?? []) { if (eventNum >= block.eventNum) { isBlocked = block.isBlocked; } } return isBlocked; } getLastBlock(userId) { const blocks = this.userBlocks[userId]?.blocks; if (!blocks || blocks.length === 0) { return undefined; } return blocks[blocks.length - 1]; } } //# sourceMappingURL=streamStateView_UserSettings.js.map