@towns-protocol/sdk 0.0.242 → 0.0.245

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.
Files changed (198) hide show
  1. package/dist/client.d.ts +5 -1
  2. package/dist/client.d.ts.map +1 -1
  3. package/dist/client.js +61 -18
  4. package/dist/client.js.map +1 -1
  5. package/dist/id.d.ts +3 -1
  6. package/dist/id.d.ts.map +1 -1
  7. package/dist/id.js +3 -0
  8. package/dist/id.js.map +1 -1
  9. package/dist/index.d.ts +4 -8
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +4 -8
  12. package/dist/index.js.map +1 -1
  13. package/dist/makeAuthenticationRpcClient.d.ts +1 -1
  14. package/dist/makeAuthenticationRpcClient.d.ts.map +1 -1
  15. package/dist/makeAuthenticationRpcClient.js +2 -2
  16. package/dist/makeAuthenticationRpcClient.js.map +1 -1
  17. package/dist/makeNotificationRpcClient.d.ts +1 -1
  18. package/dist/makeNotificationRpcClient.d.ts.map +1 -1
  19. package/dist/makeNotificationRpcClient.js +2 -2
  20. package/dist/makeNotificationRpcClient.js.map +1 -1
  21. package/dist/makeStreamRpcClient.d.ts +1 -1
  22. package/dist/makeStreamRpcClient.d.ts.map +1 -1
  23. package/dist/makeStreamRpcClient.js +2 -2
  24. package/dist/makeStreamRpcClient.js.map +1 -1
  25. package/dist/notificationService.d.ts.map +1 -1
  26. package/dist/notificationService.js +2 -1
  27. package/dist/notificationService.js.map +1 -1
  28. package/dist/riverConfig.js +1 -1
  29. package/dist/riverConfig.js.map +1 -1
  30. package/dist/rpcCommon.d.ts +1 -3
  31. package/dist/rpcCommon.d.ts.map +1 -1
  32. package/dist/rpcCommon.js +1 -13
  33. package/dist/rpcCommon.js.map +1 -1
  34. package/dist/sign.d.ts +1 -1
  35. package/dist/sign.d.ts.map +1 -1
  36. package/dist/sign.js +13 -7
  37. package/dist/sign.js.map +1 -1
  38. package/dist/stream.d.ts +4 -2
  39. package/dist/stream.d.ts.map +1 -1
  40. package/dist/stream.js +9 -6
  41. package/dist/stream.js.map +1 -1
  42. package/dist/streamEvents.d.ts +3 -3
  43. package/dist/streamEvents.d.ts.map +1 -1
  44. package/dist/streamStateView.d.ts +9 -6
  45. package/dist/streamStateView.d.ts.map +1 -1
  46. package/dist/streamStateView.js +58 -62
  47. package/dist/streamStateView.js.map +1 -1
  48. package/dist/streamStateView_Space.js +1 -1
  49. package/dist/streamStateView_Space.js.map +1 -1
  50. package/dist/streamStateView_UserMetadata.js +1 -1
  51. package/dist/streamStateView_UserMetadata.js.map +1 -1
  52. package/dist/streamUtils.d.ts.map +1 -1
  53. package/dist/streamUtils.js +2 -0
  54. package/dist/streamUtils.js.map +1 -1
  55. package/dist/streams-view/streamsView.d.ts +7 -0
  56. package/dist/streams-view/streamsView.d.ts.map +1 -0
  57. package/dist/streams-view/streamsView.js +10 -0
  58. package/dist/streams-view/streamsView.js.map +1 -0
  59. package/dist/streams-view/timelineEvents.d.ts +11 -0
  60. package/dist/streams-view/timelineEvents.d.ts.map +1 -0
  61. package/dist/{sync-agent/timeline/models/timelineEvent.js → streams-view/timelineEvents.js} +240 -303
  62. package/dist/streams-view/timelineEvents.js.map +1 -0
  63. package/dist/streams-view/timelinesView.d.ts +26 -0
  64. package/dist/streams-view/timelinesView.d.ts.map +1 -0
  65. package/dist/streams-view/timelinesView.js +111 -0
  66. package/dist/streams-view/timelinesView.js.map +1 -0
  67. package/dist/streams-view/timelinesViewModel.d.ts +38 -0
  68. package/dist/streams-view/timelinesViewModel.d.ts.map +1 -0
  69. package/dist/streams-view/timelinesViewModel.js +681 -0
  70. package/dist/streams-view/timelinesViewModel.js.map +1 -0
  71. package/dist/sync-agent/dms/models/dm.js +2 -2
  72. package/dist/sync-agent/dms/models/dm.js.map +1 -1
  73. package/dist/sync-agent/gdms/models/gdm.js +2 -2
  74. package/dist/sync-agent/gdms/models/gdm.js.map +1 -1
  75. package/dist/sync-agent/spaces/models/channel.js +3 -3
  76. package/dist/sync-agent/spaces/models/channel.js.map +1 -1
  77. package/dist/sync-agent/syncAgent.d.ts.map +1 -1
  78. package/dist/sync-agent/syncAgent.js +4 -0
  79. package/dist/sync-agent/syncAgent.js.map +1 -1
  80. package/dist/sync-agent/timeline/models/timeline-types.d.ts +2 -1
  81. package/dist/sync-agent/timeline/models/timeline-types.d.ts.map +1 -1
  82. package/dist/sync-agent/timeline/models/timeline-types.js +109 -0
  83. package/dist/sync-agent/timeline/models/timeline-types.js.map +1 -1
  84. package/dist/sync-agent/timeline/timeline.d.ts +9 -26
  85. package/dist/sync-agent/timeline/timeline.d.ts.map +1 -1
  86. package/dist/sync-agent/timeline/timeline.js +21 -226
  87. package/dist/sync-agent/timeline/timeline.js.map +1 -1
  88. package/dist/syncedStream.d.ts +2 -1
  89. package/dist/syncedStream.d.ts.map +1 -1
  90. package/dist/syncedStream.js +11 -12
  91. package/dist/syncedStream.js.map +1 -1
  92. package/dist/syncedStreams.d.ts +1 -0
  93. package/dist/syncedStreams.d.ts.map +1 -1
  94. package/dist/syncedStreams.js.map +1 -1
  95. package/dist/syncedStreamsLoop.d.ts +1 -0
  96. package/dist/syncedStreamsLoop.d.ts.map +1 -1
  97. package/dist/syncedStreamsLoop.js +7 -2
  98. package/dist/syncedStreamsLoop.js.map +1 -1
  99. package/dist/tags.d.ts.map +1 -1
  100. package/dist/tags.js +15 -16
  101. package/dist/tags.js.map +1 -1
  102. package/dist/tests/bob_testUtils.d.ts.map +1 -1
  103. package/dist/tests/bob_testUtils.js +4 -1
  104. package/dist/tests/bob_testUtils.js.map +1 -1
  105. package/dist/tests/multi/entitlements/channelsWithEntitlements.test.js +3 -3
  106. package/dist/tests/multi/entitlements/channelsWithEntitlements.test.js.map +1 -1
  107. package/dist/tests/multi/sync-agent/timeline.test.js +12 -7
  108. package/dist/tests/multi/sync-agent/timeline.test.js.map +1 -1
  109. package/dist/tests/multi/transactions_SpaceReview.test.js +11 -17
  110. package/dist/tests/multi/transactions_SpaceReview.test.js.map +1 -1
  111. package/dist/tests/multi/transactions_Tip.test.js +16 -20
  112. package/dist/tests/multi/transactions_Tip.test.js.map +1 -1
  113. package/dist/tests/multi_ne/channels.test.js +6 -8
  114. package/dist/tests/multi_ne/channels.test.js.map +1 -1
  115. package/dist/tests/multi_ne/client.test.js +45 -62
  116. package/dist/tests/multi_ne/client.test.js.map +1 -1
  117. package/dist/tests/multi_ne/clientDecryptionExtensions.test.js +6 -11
  118. package/dist/tests/multi_ne/clientDecryptionExtensions.test.js.map +1 -1
  119. package/dist/tests/multi_ne/deviceKeyMessage.test.js +6 -4
  120. package/dist/tests/multi_ne/deviceKeyMessage.test.js.map +1 -1
  121. package/dist/tests/multi_ne/gdms.test.js +6 -1
  122. package/dist/tests/multi_ne/gdms.test.js.map +1 -1
  123. package/dist/tests/multi_ne/media.test.js +1 -1
  124. package/dist/tests/multi_ne/media.test.js.map +1 -1
  125. package/dist/tests/multi_ne/space.test.js +1 -1
  126. package/dist/tests/multi_ne/space.test.js.map +1 -1
  127. package/dist/tests/multi_ne/streamRpcClient.test.js +4 -1
  128. package/dist/tests/multi_ne/streamRpcClient.test.js.map +1 -1
  129. package/dist/tests/multi_ne/streamRpcClientSync.test.js +8 -2
  130. package/dist/tests/multi_ne/streamRpcClientSync.test.js.map +1 -1
  131. package/dist/tests/multi_ne/syncWithBlocks.test.js +4 -1
  132. package/dist/tests/multi_ne/syncWithBlocks.test.js.map +1 -1
  133. package/dist/tests/multi_ne/syncedStream.test.js +39 -7
  134. package/dist/tests/multi_ne/syncedStream.test.js.map +1 -1
  135. package/dist/tests/multi_ne/syncedStreams.test.js +9 -365
  136. package/dist/tests/multi_ne/syncedStreams.test.js.map +1 -1
  137. package/dist/tests/multi_ne/tags.test.js +114 -85
  138. package/dist/tests/multi_ne/tags.test.js.map +1 -1
  139. package/dist/tests/multi_ne/userSettings.test.js +15 -15
  140. package/dist/tests/multi_ne/userSettings.test.js.map +1 -1
  141. package/dist/tests/syncAgent_testUtils.d.ts.map +1 -1
  142. package/dist/tests/syncAgent_testUtils.js +4 -0
  143. package/dist/tests/syncAgent_testUtils.js.map +1 -1
  144. package/dist/tests/testDriver_testUtils.d.ts.map +1 -1
  145. package/dist/tests/testDriver_testUtils.js +4 -7
  146. package/dist/tests/testDriver_testUtils.js.map +1 -1
  147. package/dist/tests/testUtils.d.ts +1 -0
  148. package/dist/tests/testUtils.d.ts.map +1 -1
  149. package/dist/tests/testUtils.js +13 -4
  150. package/dist/tests/testUtils.js.map +1 -1
  151. package/dist/tests/unit/crypto.test.js +6 -0
  152. package/dist/tests/unit/crypto.test.js.map +1 -1
  153. package/dist/tests/unit/crypto_utils.test.js +1 -1
  154. package/dist/tests/unit/crypto_utils.test.js.map +1 -1
  155. package/dist/tests/unit/helpers/ConversationBuilder.d.ts +39 -0
  156. package/dist/tests/unit/helpers/ConversationBuilder.d.ts.map +1 -0
  157. package/dist/tests/unit/helpers/ConversationBuilder.js +171 -0
  158. package/dist/tests/unit/helpers/ConversationBuilder.js.map +1 -0
  159. package/dist/tests/unit/timelineStoreInterface.test.d.ts +5 -0
  160. package/dist/tests/unit/timelineStoreInterface.test.d.ts.map +1 -0
  161. package/dist/tests/unit/timelineStoreInterface.test.js +343 -0
  162. package/dist/tests/unit/timelineStoreInterface.test.js.map +1 -0
  163. package/dist/unauthenticatedClient.d.ts +2 -1
  164. package/dist/unauthenticatedClient.d.ts.map +1 -1
  165. package/dist/unauthenticatedClient.js +2 -2
  166. package/dist/unauthenticatedClient.js.map +1 -1
  167. package/package.json +11 -10
  168. package/dist/crypto_utils.d.ts +0 -15
  169. package/dist/crypto_utils.d.ts.map +0 -1
  170. package/dist/crypto_utils.js +0 -99
  171. package/dist/crypto_utils.js.map +0 -1
  172. package/dist/sync-agent/timeline/models/pendingReplacedEvents.d.ts +0 -12
  173. package/dist/sync-agent/timeline/models/pendingReplacedEvents.d.ts.map +0 -1
  174. package/dist/sync-agent/timeline/models/pendingReplacedEvents.js +0 -20
  175. package/dist/sync-agent/timeline/models/pendingReplacedEvents.js.map +0 -1
  176. package/dist/sync-agent/timeline/models/reactions.d.ts +0 -13
  177. package/dist/sync-agent/timeline/models/reactions.d.ts.map +0 -1
  178. package/dist/sync-agent/timeline/models/reactions.js +0 -67
  179. package/dist/sync-agent/timeline/models/reactions.js.map +0 -1
  180. package/dist/sync-agent/timeline/models/replacedEvents.d.ts +0 -18
  181. package/dist/sync-agent/timeline/models/replacedEvents.d.ts.map +0 -1
  182. package/dist/sync-agent/timeline/models/replacedEvents.js +0 -19
  183. package/dist/sync-agent/timeline/models/replacedEvents.js.map +0 -1
  184. package/dist/sync-agent/timeline/models/threadStats.d.ts +0 -14
  185. package/dist/sync-agent/timeline/models/threadStats.d.ts.map +0 -1
  186. package/dist/sync-agent/timeline/models/threadStats.js +0 -99
  187. package/dist/sync-agent/timeline/models/threadStats.js.map +0 -1
  188. package/dist/sync-agent/timeline/models/threads.d.ts +0 -14
  189. package/dist/sync-agent/timeline/models/threads.d.ts.map +0 -1
  190. package/dist/sync-agent/timeline/models/threads.js +0 -57
  191. package/dist/sync-agent/timeline/models/threads.js.map +0 -1
  192. package/dist/sync-agent/timeline/models/timelineEvent.d.ts +0 -12
  193. package/dist/sync-agent/timeline/models/timelineEvent.d.ts.map +0 -1
  194. package/dist/sync-agent/timeline/models/timelineEvent.js.map +0 -1
  195. package/dist/sync-agent/timeline/models/timelineEvents.d.ts +0 -13
  196. package/dist/sync-agent/timeline/models/timelineEvents.d.ts.map +0 -1
  197. package/dist/sync-agent/timeline/models/timelineEvents.js +0 -37
  198. package/dist/sync-agent/timeline/models/timelineEvents.js.map +0 -1
@@ -1,15 +1,15 @@
1
- import { bin_toHexString } from '@towns-protocol/dlog';
2
- import { MembershipOp, ChannelMessage_Post_AttachmentSchema, ChannelMessage_PostSchema, } from '@towns-protocol/proto';
3
- import { isDefined, logNever, checkNever } from '../../../check';
4
- import { EventStatus, MessageType, Membership, RiverTimelineEvent, } from './timeline-types';
5
- import { userIdFromAddress, streamIdFromBytes, streamIdAsString } from '../../../id';
6
- import { isLocalEvent, isRemoteEvent, isCiphertext, } from '../../../types';
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
- import { create } from '@bufbuild/protobuf';
9
- export function toEventSA(timelineEvent, userId) {
9
+ const logger = dlogger('csb:timeline');
10
+ export function toEvent(timelineEvent, userId) {
10
11
  const eventId = timelineEvent.hashStr;
11
- const senderId = timelineEvent.creatorUserId;
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.sessionId;
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 supported?`,
114
+ error: `${description} userMetadataPayload not implemented`,
105
115
  };
106
116
  case 'userSettingsPayload':
107
117
  return {
108
- error: `${description} userSettingsPayload not supported?`,
118
+ error: `${description} userSettingsPayload not implemented`,
109
119
  };
110
120
  case 'userInboxPayload':
111
121
  return {
112
- error: `${description} userInboxPayload not supported?`,
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: payload,
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: payload,
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, description) {
453
- if (isCiphertext(payload.ciphertext)) {
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.ChannelMessageEncrypted,
466
- error: timelineEvent.decryptedContentError,
467
+ kind: RiverTimelineEvent.ChannelMessageEncryptedWithRef,
468
+ refEventId: payload.refEventId,
467
469
  },
468
470
  };
469
471
  }
470
- // do not handle non-encrypted messages that should be encrypted
471
- return { error: `${description} message text invalid channel message` };
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, payload, description) {
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 { error: `${description} encrypted channel properties` };
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 channelId = streamIdAsString(payload.channelId);
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
- export function transformAttachments(attachments) {
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