@towns-protocol/sdk 0.0.241 → 0.0.244
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client.d.ts +9 -4
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +72 -21
- package/dist/client.js.map +1 -1
- package/dist/id.d.ts +3 -1
- package/dist/id.d.ts.map +1 -1
- package/dist/id.js +3 -0
- package/dist/id.js.map +1 -1
- package/dist/index.d.ts +4 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -8
- package/dist/index.js.map +1 -1
- package/dist/makeAuthenticationRpcClient.d.ts +1 -1
- package/dist/makeAuthenticationRpcClient.d.ts.map +1 -1
- package/dist/makeAuthenticationRpcClient.js +2 -2
- package/dist/makeAuthenticationRpcClient.js.map +1 -1
- package/dist/makeNotificationRpcClient.d.ts +1 -1
- package/dist/makeNotificationRpcClient.d.ts.map +1 -1
- package/dist/makeNotificationRpcClient.js +2 -2
- package/dist/makeNotificationRpcClient.js.map +1 -1
- package/dist/makeStreamRpcClient.d.ts +1 -1
- package/dist/makeStreamRpcClient.d.ts.map +1 -1
- package/dist/makeStreamRpcClient.js +2 -2
- package/dist/makeStreamRpcClient.js.map +1 -1
- package/dist/notificationService.d.ts.map +1 -1
- package/dist/notificationService.js +2 -1
- package/dist/notificationService.js.map +1 -1
- package/dist/observable/observable.d.ts.map +1 -1
- package/dist/observable/observable.js +3 -0
- package/dist/observable/observable.js.map +1 -1
- package/dist/riverConfig.js +1 -1
- package/dist/riverConfig.js.map +1 -1
- package/dist/rpcCommon.d.ts +1 -3
- package/dist/rpcCommon.d.ts.map +1 -1
- package/dist/rpcCommon.js +1 -13
- package/dist/rpcCommon.js.map +1 -1
- package/dist/sign.d.ts +1 -1
- package/dist/sign.d.ts.map +1 -1
- package/dist/sign.js +13 -7
- package/dist/sign.js.map +1 -1
- package/dist/signerContext.js +3 -3
- package/dist/signerContext.js.map +1 -1
- package/dist/stream.d.ts +4 -2
- package/dist/stream.d.ts.map +1 -1
- package/dist/stream.js +9 -6
- package/dist/stream.js.map +1 -1
- package/dist/streamEvents.d.ts +3 -3
- package/dist/streamEvents.d.ts.map +1 -1
- package/dist/streamStateView.d.ts +9 -6
- package/dist/streamStateView.d.ts.map +1 -1
- package/dist/streamStateView.js +58 -62
- package/dist/streamStateView.js.map +1 -1
- package/dist/streamStateView_Space.js +1 -1
- package/dist/streamStateView_Space.js.map +1 -1
- package/dist/streamStateView_UserMetadata.js +1 -1
- package/dist/streamStateView_UserMetadata.js.map +1 -1
- package/dist/streamUtils.d.ts.map +1 -1
- package/dist/streamUtils.js +2 -0
- package/dist/streamUtils.js.map +1 -1
- package/dist/streams-view/streamsView.d.ts +18 -0
- package/dist/streams-view/streamsView.d.ts.map +1 -0
- package/dist/streams-view/streamsView.js +25 -0
- package/dist/streams-view/streamsView.js.map +1 -0
- package/dist/streams-view/timelineEvents.d.ts +11 -0
- package/dist/streams-view/timelineEvents.d.ts.map +1 -0
- package/dist/{sync-agent/timeline/models/timelineEvent.js → streams-view/timelineEvents.js} +240 -303
- package/dist/streams-view/timelineEvents.js.map +1 -0
- package/dist/streams-view/timelinesView.d.ts +27 -0
- package/dist/streams-view/timelinesView.d.ts.map +1 -0
- package/dist/streams-view/timelinesView.js +109 -0
- package/dist/streams-view/timelinesView.js.map +1 -0
- package/dist/streams-view/timelinesViewModel.d.ts +38 -0
- package/dist/streams-view/timelinesViewModel.d.ts.map +1 -0
- package/dist/streams-view/timelinesViewModel.js +681 -0
- package/dist/streams-view/timelinesViewModel.js.map +1 -0
- package/dist/sync-agent/dms/models/dm.js +2 -2
- package/dist/sync-agent/dms/models/dm.js.map +1 -1
- package/dist/sync-agent/gdms/models/gdm.js +2 -2
- package/dist/sync-agent/gdms/models/gdm.js.map +1 -1
- package/dist/sync-agent/spaces/models/channel.js +3 -3
- package/dist/sync-agent/spaces/models/channel.js.map +1 -1
- package/dist/sync-agent/syncAgent.d.ts.map +1 -1
- package/dist/sync-agent/syncAgent.js +4 -0
- package/dist/sync-agent/syncAgent.js.map +1 -1
- package/dist/sync-agent/timeline/models/timeline-types.d.ts +2 -1
- package/dist/sync-agent/timeline/models/timeline-types.d.ts.map +1 -1
- package/dist/sync-agent/timeline/models/timeline-types.js +109 -0
- package/dist/sync-agent/timeline/models/timeline-types.js.map +1 -1
- package/dist/sync-agent/timeline/timeline.d.ts +9 -26
- package/dist/sync-agent/timeline/timeline.d.ts.map +1 -1
- package/dist/sync-agent/timeline/timeline.js +21 -226
- package/dist/sync-agent/timeline/timeline.js.map +1 -1
- package/dist/syncedStream.d.ts +2 -1
- package/dist/syncedStream.d.ts.map +1 -1
- package/dist/syncedStream.js +11 -12
- package/dist/syncedStream.js.map +1 -1
- package/dist/syncedStreams.d.ts +1 -0
- package/dist/syncedStreams.d.ts.map +1 -1
- package/dist/syncedStreams.js.map +1 -1
- package/dist/syncedStreamsLoop.d.ts +1 -0
- package/dist/syncedStreamsLoop.d.ts.map +1 -1
- package/dist/syncedStreamsLoop.js +6 -1
- package/dist/syncedStreamsLoop.js.map +1 -1
- package/dist/tags.d.ts.map +1 -1
- package/dist/tags.js +15 -16
- package/dist/tags.js.map +1 -1
- package/dist/tests/bob_testUtils.d.ts.map +1 -1
- package/dist/tests/bob_testUtils.js +4 -1
- package/dist/tests/bob_testUtils.js.map +1 -1
- package/dist/tests/multi/entitlements/channelsWithEntitlements.test.js +3 -3
- package/dist/tests/multi/entitlements/channelsWithEntitlements.test.js.map +1 -1
- package/dist/tests/multi/sync-agent/timeline.test.js +18 -13
- package/dist/tests/multi/sync-agent/timeline.test.js.map +1 -1
- package/dist/tests/multi/transactions_SpaceReview.test.js +11 -17
- package/dist/tests/multi/transactions_SpaceReview.test.js.map +1 -1
- package/dist/tests/multi/transactions_Tip.test.js +16 -20
- package/dist/tests/multi/transactions_Tip.test.js.map +1 -1
- package/dist/tests/multi_ne/channels.test.js +6 -8
- package/dist/tests/multi_ne/channels.test.js.map +1 -1
- package/dist/tests/multi_ne/client.test.js +45 -62
- package/dist/tests/multi_ne/client.test.js.map +1 -1
- package/dist/tests/multi_ne/clientDecryptionExtensions.test.js +6 -11
- package/dist/tests/multi_ne/clientDecryptionExtensions.test.js.map +1 -1
- package/dist/tests/multi_ne/deviceKeyMessage.test.js +6 -4
- package/dist/tests/multi_ne/deviceKeyMessage.test.js.map +1 -1
- package/dist/tests/multi_ne/gdms.test.js +12 -1
- package/dist/tests/multi_ne/gdms.test.js.map +1 -1
- package/dist/tests/multi_ne/media.test.js +1 -1
- package/dist/tests/multi_ne/media.test.js.map +1 -1
- package/dist/tests/multi_ne/space.test.js +11 -2
- package/dist/tests/multi_ne/space.test.js.map +1 -1
- package/dist/tests/multi_ne/streamRpcClient.test.js +4 -1
- package/dist/tests/multi_ne/streamRpcClient.test.js.map +1 -1
- package/dist/tests/multi_ne/streamRpcClientSync.test.js +8 -2
- package/dist/tests/multi_ne/streamRpcClientSync.test.js.map +1 -1
- package/dist/tests/multi_ne/syncWithBlocks.test.js +4 -1
- package/dist/tests/multi_ne/syncWithBlocks.test.js.map +1 -1
- package/dist/tests/multi_ne/syncedStream.test.js +39 -7
- package/dist/tests/multi_ne/syncedStream.test.js.map +1 -1
- package/dist/tests/multi_ne/syncedStreams.test.js +9 -365
- package/dist/tests/multi_ne/syncedStreams.test.js.map +1 -1
- package/dist/tests/multi_ne/tags.test.js +114 -85
- package/dist/tests/multi_ne/tags.test.js.map +1 -1
- package/dist/tests/multi_ne/userSettings.test.js +15 -15
- package/dist/tests/multi_ne/userSettings.test.js.map +1 -1
- package/dist/tests/syncAgent_testUtils.d.ts.map +1 -1
- package/dist/tests/syncAgent_testUtils.js +4 -0
- package/dist/tests/syncAgent_testUtils.js.map +1 -1
- package/dist/tests/testDriver_testUtils.d.ts.map +1 -1
- package/dist/tests/testDriver_testUtils.js +4 -7
- package/dist/tests/testDriver_testUtils.js.map +1 -1
- package/dist/tests/testUtils.d.ts +1 -0
- package/dist/tests/testUtils.d.ts.map +1 -1
- package/dist/tests/testUtils.js +13 -4
- package/dist/tests/testUtils.js.map +1 -1
- package/dist/tests/unit/crypto.test.js +6 -0
- package/dist/tests/unit/crypto.test.js.map +1 -1
- package/dist/tests/unit/crypto_utils.test.js +1 -1
- package/dist/tests/unit/crypto_utils.test.js.map +1 -1
- package/dist/tests/unit/helpers/ConversationBuilder.d.ts +39 -0
- package/dist/tests/unit/helpers/ConversationBuilder.d.ts.map +1 -0
- package/dist/tests/unit/helpers/ConversationBuilder.js +171 -0
- package/dist/tests/unit/helpers/ConversationBuilder.js.map +1 -0
- package/dist/tests/unit/timelineStoreInterface.test.d.ts +5 -0
- package/dist/tests/unit/timelineStoreInterface.test.d.ts.map +1 -0
- package/dist/tests/unit/timelineStoreInterface.test.js +343 -0
- package/dist/tests/unit/timelineStoreInterface.test.js.map +1 -0
- package/dist/unauthenticatedClient.d.ts +2 -1
- package/dist/unauthenticatedClient.d.ts.map +1 -1
- package/dist/unauthenticatedClient.js +2 -2
- package/dist/unauthenticatedClient.js.map +1 -1
- package/package.json +12 -11
- package/dist/crypto_utils.d.ts +0 -15
- package/dist/crypto_utils.d.ts.map +0 -1
- package/dist/crypto_utils.js +0 -99
- package/dist/crypto_utils.js.map +0 -1
- package/dist/sync-agent/timeline/models/pendingReplacedEvents.d.ts +0 -12
- package/dist/sync-agent/timeline/models/pendingReplacedEvents.d.ts.map +0 -1
- package/dist/sync-agent/timeline/models/pendingReplacedEvents.js +0 -20
- package/dist/sync-agent/timeline/models/pendingReplacedEvents.js.map +0 -1
- package/dist/sync-agent/timeline/models/reactions.d.ts +0 -13
- package/dist/sync-agent/timeline/models/reactions.d.ts.map +0 -1
- package/dist/sync-agent/timeline/models/reactions.js +0 -67
- package/dist/sync-agent/timeline/models/reactions.js.map +0 -1
- package/dist/sync-agent/timeline/models/replacedEvents.d.ts +0 -18
- package/dist/sync-agent/timeline/models/replacedEvents.d.ts.map +0 -1
- package/dist/sync-agent/timeline/models/replacedEvents.js +0 -19
- package/dist/sync-agent/timeline/models/replacedEvents.js.map +0 -1
- package/dist/sync-agent/timeline/models/threadStats.d.ts +0 -14
- package/dist/sync-agent/timeline/models/threadStats.d.ts.map +0 -1
- package/dist/sync-agent/timeline/models/threadStats.js +0 -99
- package/dist/sync-agent/timeline/models/threadStats.js.map +0 -1
- package/dist/sync-agent/timeline/models/threads.d.ts +0 -14
- package/dist/sync-agent/timeline/models/threads.d.ts.map +0 -1
- package/dist/sync-agent/timeline/models/threads.js +0 -57
- package/dist/sync-agent/timeline/models/threads.js.map +0 -1
- package/dist/sync-agent/timeline/models/timelineEvent.d.ts +0 -12
- package/dist/sync-agent/timeline/models/timelineEvent.d.ts.map +0 -1
- package/dist/sync-agent/timeline/models/timelineEvent.js.map +0 -1
- package/dist/sync-agent/timeline/models/timelineEvents.d.ts +0 -13
- package/dist/sync-agent/timeline/models/timelineEvents.d.ts.map +0 -1
- package/dist/sync-agent/timeline/models/timelineEvents.js +0 -37
- package/dist/sync-agent/timeline/models/timelineEvents.js.map +0 -1
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { isDefined, logNever
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
1
|
+
import { MembershipOp, } from '@towns-protocol/proto';
|
|
2
|
+
import { EventStatus, RiverTimelineEvent, MessageType, Membership, } from '../sync-agent/timeline/models/timeline-types';
|
|
3
|
+
import { checkNever, isDefined, logNever } from '../check';
|
|
4
|
+
import { isLocalEvent, isRemoteEvent, } from '../types';
|
|
5
|
+
import { streamIdAsString, streamIdFromBytes, userIdFromAddress } from '../id';
|
|
6
|
+
import { getIsMentioned, getReactionParentId, getReplyParentId, getThreadParentId, } from './timelinesViewModel';
|
|
7
|
+
import { bin_toHexString, dlogger } from '@towns-protocol/dlog';
|
|
7
8
|
import { getSpaceReviewEventDataBin } from '@towns-protocol/web3';
|
|
8
|
-
|
|
9
|
-
export function
|
|
9
|
+
const logger = dlogger('csb:timeline');
|
|
10
|
+
export function toEvent(timelineEvent, userId) {
|
|
10
11
|
const eventId = timelineEvent.hashStr;
|
|
11
|
-
const senderId = timelineEvent
|
|
12
|
-
// TODO: get sender metadata from store
|
|
12
|
+
const senderId = getSenderId(timelineEvent);
|
|
13
13
|
const sender = {
|
|
14
14
|
id: senderId,
|
|
15
15
|
};
|
|
@@ -23,7 +23,9 @@ export function toEventSA(timelineEvent, userId) {
|
|
|
23
23
|
payload.value.content.case !== 'message') {
|
|
24
24
|
return undefined;
|
|
25
25
|
}
|
|
26
|
-
return payload.value.content.value.
|
|
26
|
+
return payload.value.content.value.sessionIdBytes.length > 0
|
|
27
|
+
? bin_toHexString(payload.value.content.value.sessionIdBytes)
|
|
28
|
+
: payload.value.content.value.sessionId;
|
|
27
29
|
}
|
|
28
30
|
const sessionId = extractSessionId(timelineEvent);
|
|
29
31
|
return {
|
|
@@ -51,6 +53,14 @@ export function toEventSA(timelineEvent, userId) {
|
|
|
51
53
|
sessionId,
|
|
52
54
|
};
|
|
53
55
|
}
|
|
56
|
+
function getSenderId(timelineEvent) {
|
|
57
|
+
const payload = timelineEvent.remoteEvent?.event.payload;
|
|
58
|
+
if (payload?.case === 'memberPayload' &&
|
|
59
|
+
payload?.value.content.case === 'memberBlockchainTransaction') {
|
|
60
|
+
return userIdFromAddress(payload.value.content.value.fromUserAddress);
|
|
61
|
+
}
|
|
62
|
+
return timelineEvent.creatorUserId;
|
|
63
|
+
}
|
|
54
64
|
function toTownsContent(timelineEvent) {
|
|
55
65
|
if (isLocalEvent(timelineEvent)) {
|
|
56
66
|
return toTownsContent_FromChannelMessage(timelineEvent.localEvent.channelMessage, 'local event', timelineEvent.hashStr);
|
|
@@ -101,15 +111,15 @@ function toTownsContent_fromParsedEvent(eventId, timelineEvent) {
|
|
|
101
111
|
return toTownsContent_SpacePayload(eventId, message, message.event.payload.value, description);
|
|
102
112
|
case 'userMetadataPayload':
|
|
103
113
|
return {
|
|
104
|
-
error: `${description} userMetadataPayload not
|
|
114
|
+
error: `${description} userMetadataPayload not implemented`,
|
|
105
115
|
};
|
|
106
116
|
case 'userSettingsPayload':
|
|
107
117
|
return {
|
|
108
|
-
error: `${description} userSettingsPayload not
|
|
118
|
+
error: `${description} userSettingsPayload not implemented`,
|
|
109
119
|
};
|
|
110
120
|
case 'userInboxPayload':
|
|
111
121
|
return {
|
|
112
|
-
error: `${description} userInboxPayload not
|
|
122
|
+
error: `${description} userInboxPayload not implemented`,
|
|
113
123
|
};
|
|
114
124
|
case 'miniblockHeader':
|
|
115
125
|
return toTownsContent_MiniblockHeader(eventId, message, message.event.payload.value, description);
|
|
@@ -119,6 +129,10 @@ function toTownsContent_fromParsedEvent(eventId, timelineEvent) {
|
|
|
119
129
|
};
|
|
120
130
|
case 'memberPayload':
|
|
121
131
|
return toTownsContent_MemberPayload(timelineEvent, message, message.event.payload.value, description);
|
|
132
|
+
case 'metadataPayload':
|
|
133
|
+
return {
|
|
134
|
+
error: `${description} metadataPayload not supported for timeline events`,
|
|
135
|
+
};
|
|
122
136
|
case undefined:
|
|
123
137
|
return { error: `Undefined payload case: ${description}` };
|
|
124
138
|
default:
|
|
@@ -219,24 +233,17 @@ function toTownsContent_MemberPayload(event, message, value, description) {
|
|
|
219
233
|
unpinnedEventId: bin_toHexString(value.content.value.eventId),
|
|
220
234
|
},
|
|
221
235
|
};
|
|
222
|
-
case 'encryptionAlgorithm':
|
|
223
|
-
return {
|
|
224
|
-
content: {
|
|
225
|
-
kind: RiverTimelineEvent.StreamEncryptionAlgorithm,
|
|
226
|
-
algorithm: value.content.value.algorithm,
|
|
227
|
-
},
|
|
228
|
-
};
|
|
229
236
|
case 'memberBlockchainTransaction': {
|
|
230
237
|
const fromUserAddress = value.content.value.fromUserAddress;
|
|
231
238
|
const transaction = value.content.value.transaction;
|
|
232
239
|
if (!transaction) {
|
|
233
240
|
return { error: `${description} no transaction` };
|
|
234
241
|
}
|
|
235
|
-
if (!transaction.receipt?.transactionHash) {
|
|
236
|
-
return { error: `${description} no transactionHash` };
|
|
237
|
-
}
|
|
238
242
|
switch (transaction.content.case) {
|
|
239
243
|
case 'tip': {
|
|
244
|
+
if (!transaction.receipt?.transactionHash) {
|
|
245
|
+
return { error: `${description} no transactionHash` };
|
|
246
|
+
}
|
|
240
247
|
const tipContent = transaction.content.value;
|
|
241
248
|
if (!tipContent.event) {
|
|
242
249
|
return { error: `${description} no event in tip` };
|
|
@@ -253,17 +260,6 @@ function toTownsContent_MemberPayload(event, message, value, description) {
|
|
|
253
260
|
},
|
|
254
261
|
};
|
|
255
262
|
}
|
|
256
|
-
case 'tokenTransfer':
|
|
257
|
-
return {
|
|
258
|
-
content: {
|
|
259
|
-
kind: RiverTimelineEvent.TokenTransfer,
|
|
260
|
-
transaction: transaction,
|
|
261
|
-
transfer: transaction.content.value,
|
|
262
|
-
fromUserId: userIdFromAddress(fromUserAddress),
|
|
263
|
-
createdAtEpochMs: event.createdAtEpochMs,
|
|
264
|
-
threadParentId: bin_toHexString(transaction.content.value.messageId),
|
|
265
|
-
},
|
|
266
|
-
};
|
|
267
263
|
case 'spaceReview': {
|
|
268
264
|
if (!transaction.receipt) {
|
|
269
265
|
return { error: `${description} no receipt` };
|
|
@@ -283,6 +279,19 @@ function toTownsContent_MemberPayload(event, message, value, description) {
|
|
|
283
279
|
},
|
|
284
280
|
};
|
|
285
281
|
}
|
|
282
|
+
case 'tokenTransfer': {
|
|
283
|
+
const transferContent = transaction.content.value;
|
|
284
|
+
return {
|
|
285
|
+
content: {
|
|
286
|
+
kind: RiverTimelineEvent.TokenTransfer,
|
|
287
|
+
transaction: transaction,
|
|
288
|
+
transfer: transferContent,
|
|
289
|
+
fromUserId: userIdFromAddress(fromUserAddress),
|
|
290
|
+
createdAtEpochMs: event.createdAtEpochMs,
|
|
291
|
+
threadParentId: bin_toHexString(transferContent.messageId),
|
|
292
|
+
},
|
|
293
|
+
};
|
|
294
|
+
}
|
|
286
295
|
case undefined:
|
|
287
296
|
return {
|
|
288
297
|
content: {
|
|
@@ -296,6 +305,10 @@ function toTownsContent_MemberPayload(event, message, value, description) {
|
|
|
296
305
|
return { error: `${description} unknown transaction content` };
|
|
297
306
|
}
|
|
298
307
|
}
|
|
308
|
+
case 'encryptionAlgorithm':
|
|
309
|
+
return {
|
|
310
|
+
error: `Encryption Algorithm not supported: ${description}`,
|
|
311
|
+
};
|
|
299
312
|
case undefined:
|
|
300
313
|
return { error: `Undefined payload case: ${description}` };
|
|
301
314
|
default:
|
|
@@ -342,20 +355,18 @@ function toTownsContent_UserPayload(event, message, value, description) {
|
|
|
342
355
|
};
|
|
343
356
|
}
|
|
344
357
|
case 'blockchainTransaction': {
|
|
345
|
-
const payload = value.content.value;
|
|
346
358
|
return {
|
|
347
359
|
content: {
|
|
348
360
|
kind: RiverTimelineEvent.UserBlockchainTransaction,
|
|
349
|
-
transaction:
|
|
361
|
+
transaction: value.content.value,
|
|
350
362
|
},
|
|
351
363
|
};
|
|
352
364
|
}
|
|
353
365
|
case 'receivedBlockchainTransaction': {
|
|
354
|
-
const payload = value.content.value;
|
|
355
366
|
return {
|
|
356
367
|
content: {
|
|
357
368
|
kind: RiverTimelineEvent.UserReceivedBlockchainTransaction,
|
|
358
|
-
receivedTransaction:
|
|
369
|
+
receivedTransaction: value.content.value,
|
|
359
370
|
},
|
|
360
371
|
};
|
|
361
372
|
}
|
|
@@ -449,28 +460,24 @@ function toTownsContent_FromChannelMessage(channelMessage, description, eventId)
|
|
|
449
460
|
}
|
|
450
461
|
}
|
|
451
462
|
}
|
|
452
|
-
function toTownsContent_ChannelPayload_Message(timelineEvent, payload,
|
|
453
|
-
if (
|
|
454
|
-
if (payload.refEventId) {
|
|
455
|
-
return {
|
|
456
|
-
content: {
|
|
457
|
-
kind: RiverTimelineEvent.ChannelMessageEncryptedWithRef,
|
|
458
|
-
refEventId: payload.refEventId,
|
|
459
|
-
},
|
|
460
|
-
};
|
|
461
|
-
}
|
|
463
|
+
function toTownsContent_ChannelPayload_Message(timelineEvent, payload, _description) {
|
|
464
|
+
if (payload.refEventId) {
|
|
462
465
|
return {
|
|
463
|
-
// if payload is an EncryptedData message, than it is encrypted content kind
|
|
464
466
|
content: {
|
|
465
|
-
kind: RiverTimelineEvent.
|
|
466
|
-
|
|
467
|
+
kind: RiverTimelineEvent.ChannelMessageEncryptedWithRef,
|
|
468
|
+
refEventId: payload.refEventId,
|
|
467
469
|
},
|
|
468
470
|
};
|
|
469
471
|
}
|
|
470
|
-
|
|
471
|
-
|
|
472
|
+
return {
|
|
473
|
+
// if payload is an EncryptedData message, than it is encrypted content kind
|
|
474
|
+
content: {
|
|
475
|
+
kind: RiverTimelineEvent.ChannelMessageEncrypted,
|
|
476
|
+
error: timelineEvent.decryptedContentError,
|
|
477
|
+
},
|
|
478
|
+
};
|
|
472
479
|
}
|
|
473
|
-
function toTownsContent_ChannelPayload_ChannelProperties(timelineEvent,
|
|
480
|
+
function toTownsContent_ChannelPayload_ChannelProperties(timelineEvent, _payload, _description) {
|
|
474
481
|
if (timelineEvent.decryptedContent?.kind === 'channelProperties') {
|
|
475
482
|
return {
|
|
476
483
|
content: {
|
|
@@ -480,7 +487,12 @@ function toTownsContent_ChannelPayload_ChannelProperties(timelineEvent, payload,
|
|
|
480
487
|
};
|
|
481
488
|
}
|
|
482
489
|
// If the payload is encrypted, we display nothing.
|
|
483
|
-
return {
|
|
490
|
+
return {
|
|
491
|
+
content: {
|
|
492
|
+
kind: RiverTimelineEvent.EncryptedChannelProperties,
|
|
493
|
+
error: timelineEvent.decryptedContentError,
|
|
494
|
+
},
|
|
495
|
+
};
|
|
484
496
|
}
|
|
485
497
|
function toTownsContent_ChannelPayload_Message_Post(value, eventId, editsEventId, description) {
|
|
486
498
|
switch (value.content.case) {
|
|
@@ -552,12 +564,12 @@ function toTownsContent_SpacePayload(eventId, message, value, description) {
|
|
|
552
564
|
}
|
|
553
565
|
case 'channel': {
|
|
554
566
|
const payload = value.content.value;
|
|
555
|
-
const
|
|
567
|
+
const childId = streamIdAsString(payload.channelId);
|
|
556
568
|
return {
|
|
557
569
|
content: {
|
|
558
570
|
kind: RiverTimelineEvent.ChannelCreate,
|
|
559
571
|
creatorId: message.creatorUserId,
|
|
560
|
-
channelId,
|
|
572
|
+
channelId: childId,
|
|
561
573
|
channelOp: payload.op,
|
|
562
574
|
channelSettings: payload.settings,
|
|
563
575
|
},
|
|
@@ -620,6 +632,7 @@ function getEventStatus(timelineEvent) {
|
|
|
620
632
|
}
|
|
621
633
|
}
|
|
622
634
|
else {
|
|
635
|
+
logger.error('$$$ timelineStoreEvents unknown event status', { timelineEvent });
|
|
623
636
|
return EventStatus.NOT_SENT;
|
|
624
637
|
}
|
|
625
638
|
}
|
|
@@ -634,6 +647,9 @@ function toAttachment(attachment, parentEventId, index) {
|
|
|
634
647
|
case 'chunkedMedia': {
|
|
635
648
|
const info = attachment.content.value.info;
|
|
636
649
|
if (!info) {
|
|
650
|
+
logger.error('$$$ timelineStoreEvents invalid chunkedMedia attachment', {
|
|
651
|
+
attachment,
|
|
652
|
+
});
|
|
637
653
|
return undefined;
|
|
638
654
|
}
|
|
639
655
|
const thumbnailInfo = attachment.content.value.thumbnail?.info;
|
|
@@ -648,6 +664,9 @@ function toAttachment(attachment, parentEventId, index) {
|
|
|
648
664
|
? attachment.content.value.encryption.value
|
|
649
665
|
: undefined;
|
|
650
666
|
if (!encryption) {
|
|
667
|
+
logger.error('$$$ timelineStoreEvents invalid chunkedMedia encryption', {
|
|
668
|
+
attachment,
|
|
669
|
+
});
|
|
651
670
|
return undefined;
|
|
652
671
|
}
|
|
653
672
|
return {
|
|
@@ -705,10 +724,172 @@ function toAttachment(attachment, parentEventId, index) {
|
|
|
705
724
|
id,
|
|
706
725
|
};
|
|
707
726
|
}
|
|
727
|
+
case 'ticker': {
|
|
728
|
+
const content = attachment.content.value;
|
|
729
|
+
return {
|
|
730
|
+
id,
|
|
731
|
+
type: 'ticker',
|
|
732
|
+
address: content.address,
|
|
733
|
+
chainId: content.chainId,
|
|
734
|
+
};
|
|
735
|
+
}
|
|
708
736
|
default:
|
|
709
737
|
return undefined;
|
|
710
738
|
}
|
|
711
739
|
}
|
|
740
|
+
/// fill in the event with the decrypted content
|
|
741
|
+
/// i don't love this since it duplicates code, but it makes it so that we don't have to keep the
|
|
742
|
+
/// original RemoteTimelineEvent around in memory
|
|
743
|
+
export function toDecryptedEvent(event, decryptedContent, userId) {
|
|
744
|
+
if (!event.content) {
|
|
745
|
+
logger.error('$$$ timelineStoreEvents invalid event in toDecryptedEvent', {
|
|
746
|
+
event,
|
|
747
|
+
decryptedContent,
|
|
748
|
+
});
|
|
749
|
+
return event;
|
|
750
|
+
}
|
|
751
|
+
switch (event.content.kind) {
|
|
752
|
+
case RiverTimelineEvent.ChannelMessageEncrypted:
|
|
753
|
+
case RiverTimelineEvent.ChannelMessageEncryptedWithRef: {
|
|
754
|
+
if (decryptedContent.kind === 'channelMessage') {
|
|
755
|
+
const { content, error } = toTownsContent_FromChannelMessage(decryptedContent.content, `ChannelMessage: ${event.eventId}`, event.eventId);
|
|
756
|
+
if (error) {
|
|
757
|
+
return event;
|
|
758
|
+
}
|
|
759
|
+
return {
|
|
760
|
+
...event,
|
|
761
|
+
content,
|
|
762
|
+
threadParentId: getThreadParentId(content),
|
|
763
|
+
replyParentId: getReplyParentId(content),
|
|
764
|
+
reactionParentId: getReactionParentId(content),
|
|
765
|
+
isMentioned: getIsMentioned(content, userId),
|
|
766
|
+
};
|
|
767
|
+
}
|
|
768
|
+
else {
|
|
769
|
+
logger.error('$$$ timelineStoreEvents invalid channelMessageEncrypted', {
|
|
770
|
+
event,
|
|
771
|
+
decryptedContent,
|
|
772
|
+
});
|
|
773
|
+
return event;
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
case RiverTimelineEvent.SpaceDisplayName: {
|
|
777
|
+
if (decryptedContent.kind === 'text') {
|
|
778
|
+
return {
|
|
779
|
+
...event,
|
|
780
|
+
content: {
|
|
781
|
+
...event.content,
|
|
782
|
+
displayName: decryptedContent.content,
|
|
783
|
+
},
|
|
784
|
+
};
|
|
785
|
+
}
|
|
786
|
+
else {
|
|
787
|
+
logger.error('$$$ timelineStoreEvents invalid spaceDisplayName', {
|
|
788
|
+
event,
|
|
789
|
+
decryptedContent,
|
|
790
|
+
});
|
|
791
|
+
return event;
|
|
792
|
+
}
|
|
793
|
+
}
|
|
794
|
+
case RiverTimelineEvent.SpaceUsername: {
|
|
795
|
+
if (decryptedContent.kind === 'text') {
|
|
796
|
+
return {
|
|
797
|
+
...event,
|
|
798
|
+
content: {
|
|
799
|
+
...event.content,
|
|
800
|
+
username: decryptedContent.content,
|
|
801
|
+
},
|
|
802
|
+
};
|
|
803
|
+
}
|
|
804
|
+
else {
|
|
805
|
+
logger.error('$$$ timelineStoreEvents invalid spaceUsername', {
|
|
806
|
+
event,
|
|
807
|
+
decryptedContent,
|
|
808
|
+
});
|
|
809
|
+
return event;
|
|
810
|
+
}
|
|
811
|
+
}
|
|
812
|
+
case RiverTimelineEvent.EncryptedChannelProperties: {
|
|
813
|
+
if (decryptedContent.kind === 'channelProperties') {
|
|
814
|
+
return {
|
|
815
|
+
...event,
|
|
816
|
+
content: {
|
|
817
|
+
kind: RiverTimelineEvent.ChannelProperties,
|
|
818
|
+
properties: decryptedContent.content,
|
|
819
|
+
},
|
|
820
|
+
};
|
|
821
|
+
}
|
|
822
|
+
else {
|
|
823
|
+
logger.error('$$$ timelineStoreEvents invalid encryptedChannelProperties', {
|
|
824
|
+
event,
|
|
825
|
+
decryptedContent,
|
|
826
|
+
});
|
|
827
|
+
return event;
|
|
828
|
+
}
|
|
829
|
+
}
|
|
830
|
+
case RiverTimelineEvent.ChannelCreate:
|
|
831
|
+
case RiverTimelineEvent.ChannelMessage:
|
|
832
|
+
case RiverTimelineEvent.ChannelMessageMissing:
|
|
833
|
+
case RiverTimelineEvent.ChannelProperties:
|
|
834
|
+
case RiverTimelineEvent.Inception:
|
|
835
|
+
case RiverTimelineEvent.KeySolicitation:
|
|
836
|
+
case RiverTimelineEvent.Fulfillment:
|
|
837
|
+
case RiverTimelineEvent.MemberBlockchainTransaction:
|
|
838
|
+
case RiverTimelineEvent.MiniblockHeader:
|
|
839
|
+
case RiverTimelineEvent.Pin:
|
|
840
|
+
case RiverTimelineEvent.Reaction:
|
|
841
|
+
case RiverTimelineEvent.RedactedEvent:
|
|
842
|
+
case RiverTimelineEvent.RedactionActionEvent:
|
|
843
|
+
case RiverTimelineEvent.SpaceEnsAddress:
|
|
844
|
+
case RiverTimelineEvent.SpaceNft:
|
|
845
|
+
case RiverTimelineEvent.SpaceReview:
|
|
846
|
+
case RiverTimelineEvent.TokenTransfer:
|
|
847
|
+
case RiverTimelineEvent.TipEvent:
|
|
848
|
+
case RiverTimelineEvent.SpaceUpdateAutojoin:
|
|
849
|
+
case RiverTimelineEvent.SpaceUpdateHideUserJoinLeaves:
|
|
850
|
+
case RiverTimelineEvent.SpaceImage:
|
|
851
|
+
case RiverTimelineEvent.StreamEncryptionAlgorithm:
|
|
852
|
+
case RiverTimelineEvent.StreamMembership:
|
|
853
|
+
case RiverTimelineEvent.Unpin:
|
|
854
|
+
case RiverTimelineEvent.UserBlockchainTransaction:
|
|
855
|
+
case RiverTimelineEvent.UserReceivedBlockchainTransaction:
|
|
856
|
+
return event;
|
|
857
|
+
default:
|
|
858
|
+
logNever(event.content);
|
|
859
|
+
return event;
|
|
860
|
+
}
|
|
861
|
+
}
|
|
862
|
+
export function toDecryptedContentErrorEvent(event, error) {
|
|
863
|
+
switch (event.content?.kind) {
|
|
864
|
+
case RiverTimelineEvent.ChannelMessageEncrypted:
|
|
865
|
+
case RiverTimelineEvent.EncryptedChannelProperties:
|
|
866
|
+
return {
|
|
867
|
+
...event,
|
|
868
|
+
content: {
|
|
869
|
+
...event.content,
|
|
870
|
+
error,
|
|
871
|
+
},
|
|
872
|
+
};
|
|
873
|
+
break;
|
|
874
|
+
}
|
|
875
|
+
return event;
|
|
876
|
+
}
|
|
877
|
+
export function toMembership(membershipOp) {
|
|
878
|
+
switch (membershipOp) {
|
|
879
|
+
case MembershipOp.SO_JOIN:
|
|
880
|
+
return Membership.Join;
|
|
881
|
+
case MembershipOp.SO_INVITE:
|
|
882
|
+
return Membership.Invite;
|
|
883
|
+
case MembershipOp.SO_LEAVE:
|
|
884
|
+
return Membership.Leave;
|
|
885
|
+
case MembershipOp.SO_UNSPECIFIED:
|
|
886
|
+
return Membership.None;
|
|
887
|
+
case undefined:
|
|
888
|
+
return Membership.None;
|
|
889
|
+
default:
|
|
890
|
+
checkNever(membershipOp);
|
|
891
|
+
}
|
|
892
|
+
}
|
|
712
893
|
export function getFallbackContent(senderDisplayName, content, error) {
|
|
713
894
|
if (error) {
|
|
714
895
|
return error;
|
|
@@ -803,248 +984,4 @@ function getFallbackContent_BlockchainTransaction(transaction) {
|
|
|
803
984
|
return `kind: ${transaction.content.case ?? 'unspecified'}`;
|
|
804
985
|
}
|
|
805
986
|
}
|
|
806
|
-
|
|
807
|
-
if (!attachments) {
|
|
808
|
-
return [];
|
|
809
|
-
}
|
|
810
|
-
return attachments
|
|
811
|
-
.map((attachment) => {
|
|
812
|
-
switch (attachment.type) {
|
|
813
|
-
case 'chunked_media':
|
|
814
|
-
return create(ChannelMessage_Post_AttachmentSchema, {
|
|
815
|
-
content: {
|
|
816
|
-
case: 'chunkedMedia',
|
|
817
|
-
value: {
|
|
818
|
-
info: attachment.info,
|
|
819
|
-
streamId: attachment.streamId,
|
|
820
|
-
encryption: {
|
|
821
|
-
case: 'aesgcm',
|
|
822
|
-
value: attachment.encryption,
|
|
823
|
-
},
|
|
824
|
-
thumbnail: {
|
|
825
|
-
info: attachment.thumbnail?.info,
|
|
826
|
-
content: attachment.thumbnail?.content,
|
|
827
|
-
},
|
|
828
|
-
},
|
|
829
|
-
},
|
|
830
|
-
});
|
|
831
|
-
case 'embedded_media':
|
|
832
|
-
return create(ChannelMessage_Post_AttachmentSchema, {
|
|
833
|
-
content: {
|
|
834
|
-
case: 'embeddedMedia',
|
|
835
|
-
value: {
|
|
836
|
-
info: attachment.info,
|
|
837
|
-
content: attachment.content,
|
|
838
|
-
},
|
|
839
|
-
},
|
|
840
|
-
});
|
|
841
|
-
case 'image':
|
|
842
|
-
return create(ChannelMessage_Post_AttachmentSchema, {
|
|
843
|
-
content: {
|
|
844
|
-
case: 'image',
|
|
845
|
-
value: {
|
|
846
|
-
info: attachment.info,
|
|
847
|
-
},
|
|
848
|
-
},
|
|
849
|
-
});
|
|
850
|
-
case 'embedded_message': {
|
|
851
|
-
const { channelMessageEvent, ...content } = attachment;
|
|
852
|
-
if (!channelMessageEvent) {
|
|
853
|
-
return;
|
|
854
|
-
}
|
|
855
|
-
const post = create(ChannelMessage_PostSchema, {
|
|
856
|
-
threadId: channelMessageEvent.threadId,
|
|
857
|
-
threadPreview: channelMessageEvent.threadPreview,
|
|
858
|
-
content: {
|
|
859
|
-
case: 'text',
|
|
860
|
-
value: {
|
|
861
|
-
...channelMessageEvent,
|
|
862
|
-
attachments: transformAttachments(channelMessageEvent.attachments),
|
|
863
|
-
},
|
|
864
|
-
},
|
|
865
|
-
});
|
|
866
|
-
const value = create(ChannelMessage_Post_AttachmentSchema, {
|
|
867
|
-
content: {
|
|
868
|
-
case: 'embeddedMessage',
|
|
869
|
-
value: {
|
|
870
|
-
...content,
|
|
871
|
-
post,
|
|
872
|
-
},
|
|
873
|
-
},
|
|
874
|
-
});
|
|
875
|
-
return value;
|
|
876
|
-
}
|
|
877
|
-
case 'unfurled_link':
|
|
878
|
-
return create(ChannelMessage_Post_AttachmentSchema, {
|
|
879
|
-
content: {
|
|
880
|
-
case: 'unfurledUrl',
|
|
881
|
-
value: {
|
|
882
|
-
url: attachment.url,
|
|
883
|
-
title: attachment.title,
|
|
884
|
-
description: attachment.description,
|
|
885
|
-
image: attachment.image
|
|
886
|
-
? {
|
|
887
|
-
height: attachment.image.height,
|
|
888
|
-
width: attachment.image.width,
|
|
889
|
-
url: attachment.image.url,
|
|
890
|
-
}
|
|
891
|
-
: undefined,
|
|
892
|
-
},
|
|
893
|
-
},
|
|
894
|
-
});
|
|
895
|
-
case 'ticker':
|
|
896
|
-
return create(ChannelMessage_Post_AttachmentSchema, {
|
|
897
|
-
content: {
|
|
898
|
-
case: 'ticker',
|
|
899
|
-
value: {
|
|
900
|
-
chainId: attachment.chainId,
|
|
901
|
-
address: attachment.address,
|
|
902
|
-
},
|
|
903
|
-
},
|
|
904
|
-
});
|
|
905
|
-
default:
|
|
906
|
-
logNever(attachment);
|
|
907
|
-
return undefined;
|
|
908
|
-
}
|
|
909
|
-
})
|
|
910
|
-
.filter(isDefined);
|
|
911
|
-
}
|
|
912
|
-
function getThreadParentId(content) {
|
|
913
|
-
return content?.kind === RiverTimelineEvent.ChannelMessage ? content.threadId : undefined;
|
|
914
|
-
}
|
|
915
|
-
function getReplyParentId(content) {
|
|
916
|
-
return content?.kind === RiverTimelineEvent.ChannelMessage ? content.replyId : undefined;
|
|
917
|
-
}
|
|
918
|
-
function getReactionParentId(content) {
|
|
919
|
-
return content?.kind === RiverTimelineEvent.Reaction ? content.targetEventId : undefined;
|
|
920
|
-
}
|
|
921
|
-
function getIsMentioned(content, userId) {
|
|
922
|
-
//TODO: comparison below should be changed as soon as this HNT-1576 will be resolved
|
|
923
|
-
return content?.kind === RiverTimelineEvent.ChannelMessage
|
|
924
|
-
? content.mentions.findIndex((x) => (x.userId ?? '')
|
|
925
|
-
.toLowerCase()
|
|
926
|
-
.localeCompare(userId.toLowerCase(), undefined, { sensitivity: 'base' }) == 0) >= 0
|
|
927
|
-
: false;
|
|
928
|
-
}
|
|
929
|
-
export function toMembership(membershipOp) {
|
|
930
|
-
switch (membershipOp) {
|
|
931
|
-
case MembershipOp.SO_JOIN:
|
|
932
|
-
return Membership.Join;
|
|
933
|
-
case MembershipOp.SO_INVITE:
|
|
934
|
-
return Membership.Invite;
|
|
935
|
-
case MembershipOp.SO_LEAVE:
|
|
936
|
-
return Membership.Leave;
|
|
937
|
-
case MembershipOp.SO_UNSPECIFIED:
|
|
938
|
-
return Membership.None;
|
|
939
|
-
case undefined:
|
|
940
|
-
return Membership.None;
|
|
941
|
-
default:
|
|
942
|
-
checkNever(membershipOp);
|
|
943
|
-
}
|
|
944
|
-
}
|
|
945
|
-
export function toReplacedMessageEvent(prev, next) {
|
|
946
|
-
if (!canReplaceEvent(prev, next)) {
|
|
947
|
-
return prev;
|
|
948
|
-
}
|
|
949
|
-
else if (next.content?.kind === RiverTimelineEvent.ChannelMessage &&
|
|
950
|
-
prev.content?.kind === RiverTimelineEvent.ChannelMessage) {
|
|
951
|
-
// when we replace an event, we copy the content up to the root event
|
|
952
|
-
// so we keep the prev id, but use the next content
|
|
953
|
-
const isLocalId = prev.eventId.startsWith('~');
|
|
954
|
-
const eventId = !isLocalId ? prev.eventId : next.eventId;
|
|
955
|
-
return {
|
|
956
|
-
...next,
|
|
957
|
-
eventId: eventId,
|
|
958
|
-
eventNum: prev.eventNum,
|
|
959
|
-
latestEventId: next.eventId,
|
|
960
|
-
latestEventNum: next.eventNum,
|
|
961
|
-
confirmedEventNum: prev.confirmedEventNum ?? next.confirmedEventNum,
|
|
962
|
-
confirmedInBlockNum: prev.confirmedInBlockNum ?? next.confirmedInBlockNum,
|
|
963
|
-
createdAtEpochMs: prev.createdAtEpochMs,
|
|
964
|
-
updatedAtEpochMs: next.createdAtEpochMs,
|
|
965
|
-
content: {
|
|
966
|
-
...next.content,
|
|
967
|
-
threadId: prev.content.threadId,
|
|
968
|
-
},
|
|
969
|
-
threadParentId: prev.threadParentId,
|
|
970
|
-
reactionParentId: prev.reactionParentId,
|
|
971
|
-
sender: prev.sender,
|
|
972
|
-
};
|
|
973
|
-
}
|
|
974
|
-
else if (next.content?.kind === RiverTimelineEvent.RedactedEvent) {
|
|
975
|
-
// for redacted events, carry over previous pointers to content
|
|
976
|
-
// we don't want to lose thread info
|
|
977
|
-
return {
|
|
978
|
-
...next,
|
|
979
|
-
eventId: prev.eventId,
|
|
980
|
-
eventNum: prev.eventNum,
|
|
981
|
-
latestEventId: next.eventId,
|
|
982
|
-
latestEventNum: next.eventNum,
|
|
983
|
-
confirmedEventNum: prev.confirmedEventNum ?? next.confirmedEventNum,
|
|
984
|
-
confirmedInBlockNum: prev.confirmedInBlockNum ?? next.confirmedInBlockNum,
|
|
985
|
-
createdAtEpochMs: prev.createdAtEpochMs,
|
|
986
|
-
updatedAtEpochMs: next.createdAtEpochMs,
|
|
987
|
-
threadParentId: prev.threadParentId,
|
|
988
|
-
reactionParentId: prev.reactionParentId,
|
|
989
|
-
};
|
|
990
|
-
}
|
|
991
|
-
else if (prev.content?.kind === RiverTimelineEvent.RedactedEvent) {
|
|
992
|
-
// replacing a redacted event should maintain the redacted state
|
|
993
|
-
return {
|
|
994
|
-
...prev,
|
|
995
|
-
latestEventId: next.eventId,
|
|
996
|
-
latestEventNum: next.eventNum,
|
|
997
|
-
confirmedEventNum: prev.confirmedEventNum ?? next.confirmedEventNum,
|
|
998
|
-
confirmedInBlockNum: prev.confirmedInBlockNum ?? next.confirmedInBlockNum,
|
|
999
|
-
};
|
|
1000
|
-
}
|
|
1001
|
-
else {
|
|
1002
|
-
// make sure we carry the createdAtEpochMs of the previous event
|
|
1003
|
-
// so we don't end up with a timeline that has events out of order.
|
|
1004
|
-
return {
|
|
1005
|
-
...next,
|
|
1006
|
-
eventId: prev.eventId,
|
|
1007
|
-
eventNum: prev.eventNum,
|
|
1008
|
-
latestEventId: next.eventId,
|
|
1009
|
-
latestEventNum: next.eventNum,
|
|
1010
|
-
confirmedEventNum: prev.confirmedEventNum ?? next.confirmedEventNum,
|
|
1011
|
-
confirmedInBlockNum: prev.confirmedInBlockNum ?? next.confirmedInBlockNum,
|
|
1012
|
-
createdAtEpochMs: prev.createdAtEpochMs,
|
|
1013
|
-
updatedAtEpochMs: next.createdAtEpochMs,
|
|
1014
|
-
};
|
|
1015
|
-
}
|
|
1016
|
-
}
|
|
1017
|
-
function canReplaceEvent(prev, next) {
|
|
1018
|
-
if (next.content?.kind === RiverTimelineEvent.RedactedEvent && next.content.isAdminRedaction) {
|
|
1019
|
-
return true;
|
|
1020
|
-
}
|
|
1021
|
-
if (next.sender.id === prev.sender.id) {
|
|
1022
|
-
return true;
|
|
1023
|
-
}
|
|
1024
|
-
return false;
|
|
1025
|
-
}
|
|
1026
|
-
export function makeRedactionEvent(redactionAction) {
|
|
1027
|
-
if (redactionAction.content?.kind !== RiverTimelineEvent.RedactionActionEvent) {
|
|
1028
|
-
throw new Error('makeRedactionEvent called with non-redaction action event');
|
|
1029
|
-
}
|
|
1030
|
-
const newContent = {
|
|
1031
|
-
kind: RiverTimelineEvent.RedactedEvent,
|
|
1032
|
-
isAdminRedaction: redactionAction.content.adminRedaction,
|
|
1033
|
-
};
|
|
1034
|
-
return {
|
|
1035
|
-
...redactionAction,
|
|
1036
|
-
content: newContent,
|
|
1037
|
-
fallbackContent: getFallbackContent('', newContent),
|
|
1038
|
-
isRedacted: true,
|
|
1039
|
-
};
|
|
1040
|
-
}
|
|
1041
|
-
export function getMessageSenderId(event) {
|
|
1042
|
-
if (!getChannelMessageContent(event)) {
|
|
1043
|
-
return undefined;
|
|
1044
|
-
}
|
|
1045
|
-
return event.sender.id;
|
|
1046
|
-
}
|
|
1047
|
-
export function getChannelMessageContent(event) {
|
|
1048
|
-
return event?.content?.kind === RiverTimelineEvent.ChannelMessage ? event.content : undefined;
|
|
1049
|
-
}
|
|
1050
|
-
//# sourceMappingURL=timelineEvent.js.map
|
|
987
|
+
//# sourceMappingURL=timelineEvents.js.map
|