@towns-protocol/sdk
Version:
For more details, visit the following resources:
88 lines • 3.64 kB
JavaScript
import { StreamStateView_AbstractContent } from './streamStateView_AbstractContent';
import { check } from '@towns-protocol/dlog';
import { logNever } from './check';
import { userIdFromAddress } from './id';
export class StreamStateView_DMChannel extends StreamStateView_AbstractContent {
dmStreamsView;
streamId;
get firstPartyId() {
return this.dmStreamModel.firstPartyId;
}
get secondPartyId() {
return this.dmStreamModel.secondPartyId;
}
get lastEventCreatedAtEpochMs() {
return this.dmStreamModel.lastEventCreatedAtEpochMs;
}
get dmStreamModel() {
return this.dmStreamsView.get(this.streamId);
}
constructor(streamId, dmStreamsView) {
super();
this.dmStreamsView = dmStreamsView;
this.streamId = streamId;
}
applySnapshot(snapshot, content, _cleartexts, _encryptionEmitter) {
if (content.inception) {
this.dmStreamsView.setParticipants(this.streamId, userIdFromAddress(content.inception.firstPartyAddress), userIdFromAddress(content.inception.secondPartyAddress));
}
}
appendEvent(event, cleartext, encryptionEmitter, stateEmitter) {
check(event.remoteEvent.event.payload.case === 'dmChannelPayload');
const payload = event.remoteEvent.event.payload.value;
switch (payload.content.case) {
case 'inception':
this.updateLastEvent(event.remoteEvent, stateEmitter);
break;
case 'message':
this.decryptEvent('channelMessage', event, payload.content.value, cleartext, encryptionEmitter);
this.updateLastEvent(event.remoteEvent, stateEmitter);
break;
case undefined:
break;
default:
logNever(payload.content);
}
}
prependEvent(event, cleartext, encryptionEmitter, _stateEmitter) {
check(event.remoteEvent.event.payload.case === 'dmChannelPayload');
const payload = event.remoteEvent.event.payload.value;
switch (payload.content.case) {
case 'inception':
this.updateLastEvent(event.remoteEvent, undefined);
break;
case 'message':
this.decryptEvent('channelMessage', event, payload.content.value, cleartext, encryptionEmitter);
this.updateLastEvent(event.remoteEvent, undefined);
break;
case undefined:
break;
default:
logNever(payload.content);
}
}
onDecryptedContent(_eventId, _content, _stateEmitter) {
// pass
}
onConfirmedEvent(event, stateEmitter, encryptionEmitter) {
super.onConfirmedEvent(event, stateEmitter, encryptionEmitter);
}
onAppendLocalEvent(event, stateEmitter) {
this.dmStreamsView.setLastEventCreatedAtEpochMs(this.streamId, event.createdAtEpochMs);
stateEmitter?.emit('streamLatestTimestampUpdated', this.streamId);
}
updateLastEvent(event, stateEmitter) {
const createdAtEpochMs = event.event.createdAtEpochMs;
if (createdAtEpochMs > this.lastEventCreatedAtEpochMs) {
this.dmStreamsView.setLastEventCreatedAtEpochMs(this.streamId, createdAtEpochMs);
stateEmitter?.emit('streamLatestTimestampUpdated', this.streamId);
}
}
participants() {
if (!this.firstPartyId || !this.secondPartyId) {
return new Set();
}
return new Set([this.firstPartyId, this.secondPartyId]);
}
}
//# sourceMappingURL=streamStateView_DMChannel.js.map