@towns-labs/sdk 2.0.11 → 2.0.12

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 (156) hide show
  1. package/dist/client.d.ts +3 -1
  2. package/dist/client.d.ts.map +1 -1
  3. package/dist/client.js +45 -1
  4. package/dist/client.js.map +1 -1
  5. package/dist/index.d.ts +0 -2
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +0 -2
  8. package/dist/index.js.map +1 -1
  9. package/dist/streamStateView_User.d.ts.map +1 -1
  10. package/dist/streamStateView_User.js +1 -0
  11. package/dist/streamStateView_User.js.map +1 -1
  12. package/dist/streamStateView_UserInbox.d.ts.map +1 -1
  13. package/dist/streamStateView_UserInbox.js +1 -0
  14. package/dist/streamStateView_UserInbox.js.map +1 -1
  15. package/dist/streamStateView_UserMetadata.d.ts.map +1 -1
  16. package/dist/streamStateView_UserMetadata.js +1 -0
  17. package/dist/streamStateView_UserMetadata.js.map +1 -1
  18. package/dist/streamStateView_UserSettings.d.ts.map +1 -1
  19. package/dist/streamStateView_UserSettings.js +9 -1
  20. package/dist/streamStateView_UserSettings.js.map +1 -1
  21. package/dist/sync-agent/dms/dms.d.ts +5 -5
  22. package/dist/sync-agent/dms/dms.d.ts.map +1 -1
  23. package/dist/sync-agent/dms/dms.js +12 -27
  24. package/dist/sync-agent/dms/dms.js.map +1 -1
  25. package/dist/sync-agent/dms/models/dm.d.ts +4 -5
  26. package/dist/sync-agent/dms/models/dm.d.ts.map +1 -1
  27. package/dist/sync-agent/dms/models/dm.js +28 -34
  28. package/dist/sync-agent/dms/models/dm.js.map +1 -1
  29. package/dist/sync-agent/gdms/gdms.d.ts +5 -6
  30. package/dist/sync-agent/gdms/gdms.d.ts.map +1 -1
  31. package/dist/sync-agent/gdms/gdms.js +12 -27
  32. package/dist/sync-agent/gdms/gdms.js.map +1 -1
  33. package/dist/sync-agent/gdms/models/gdm.d.ts +7 -5
  34. package/dist/sync-agent/gdms/models/gdm.d.ts.map +1 -1
  35. package/dist/sync-agent/gdms/models/gdm.js +29 -34
  36. package/dist/sync-agent/gdms/models/gdm.js.map +1 -1
  37. package/dist/sync-agent/members/members.d.ts +6 -18
  38. package/dist/sync-agent/members/members.d.ts.map +1 -1
  39. package/dist/sync-agent/members/members.js +25 -124
  40. package/dist/sync-agent/members/members.js.map +1 -1
  41. package/dist/sync-agent/members/models/member.d.ts +3 -45
  42. package/dist/sync-agent/members/models/member.d.ts.map +1 -1
  43. package/dist/sync-agent/members/models/member.js +15 -114
  44. package/dist/sync-agent/members/models/member.js.map +1 -1
  45. package/dist/sync-agent/members/models/myself.d.ts +1 -11
  46. package/dist/sync-agent/members/models/myself.d.ts.map +1 -1
  47. package/dist/sync-agent/members/models/myself.js +1 -84
  48. package/dist/sync-agent/members/models/myself.js.map +1 -1
  49. package/dist/sync-agent/river-connection/riverConnection.d.ts +5 -11
  50. package/dist/sync-agent/river-connection/riverConnection.d.ts.map +1 -1
  51. package/dist/sync-agent/river-connection/riverConnection.js +27 -29
  52. package/dist/sync-agent/river-connection/riverConnection.js.map +1 -1
  53. package/dist/sync-agent/spaces/models/channel.d.ts +7 -26
  54. package/dist/sync-agent/spaces/models/channel.d.ts.map +1 -1
  55. package/dist/sync-agent/spaces/models/channel.js +24 -37
  56. package/dist/sync-agent/spaces/models/channel.js.map +1 -1
  57. package/dist/sync-agent/spaces/models/space.d.ts +4 -5
  58. package/dist/sync-agent/spaces/models/space.d.ts.map +1 -1
  59. package/dist/sync-agent/spaces/models/space.js +27 -37
  60. package/dist/sync-agent/spaces/models/space.js.map +1 -1
  61. package/dist/sync-agent/spaces/spaces.d.ts +8 -11
  62. package/dist/sync-agent/spaces/spaces.d.ts.map +1 -1
  63. package/dist/sync-agent/spaces/spaces.js +13 -28
  64. package/dist/sync-agent/spaces/spaces.js.map +1 -1
  65. package/dist/sync-agent/syncAgent.d.ts +13 -18
  66. package/dist/sync-agent/syncAgent.d.ts.map +1 -1
  67. package/dist/sync-agent/syncAgent.js +5 -14
  68. package/dist/sync-agent/syncAgent.js.map +1 -1
  69. package/dist/sync-agent/user/models/userInbox.d.ts +4 -17
  70. package/dist/sync-agent/user/models/userInbox.d.ts.map +1 -1
  71. package/dist/sync-agent/user/models/userInbox.js +14 -61
  72. package/dist/sync-agent/user/models/userInbox.js.map +1 -1
  73. package/dist/sync-agent/user/models/userMemberships.d.ts +6 -22
  74. package/dist/sync-agent/user/models/userMemberships.d.ts.map +1 -1
  75. package/dist/sync-agent/user/models/userMemberships.js +16 -68
  76. package/dist/sync-agent/user/models/userMemberships.js.map +1 -1
  77. package/dist/sync-agent/user/models/userMetadata.d.ts +4 -17
  78. package/dist/sync-agent/user/models/userMetadata.d.ts.map +1 -1
  79. package/dist/sync-agent/user/models/userMetadata.js +14 -61
  80. package/dist/sync-agent/user/models/userMetadata.js.map +1 -1
  81. package/dist/sync-agent/user/models/userSettings.d.ts +5 -8
  82. package/dist/sync-agent/user/models/userSettings.d.ts.map +1 -1
  83. package/dist/sync-agent/user/models/userSettings.js +15 -42
  84. package/dist/sync-agent/user/models/userSettings.js.map +1 -1
  85. package/dist/sync-agent/user/user.d.ts +2 -6
  86. package/dist/sync-agent/user/user.d.ts.map +1 -1
  87. package/dist/sync-agent/user/user.js +9 -20
  88. package/dist/sync-agent/user/user.js.map +1 -1
  89. package/dist/tests/multi_ne/sync-agent/member.test.d.ts +2 -0
  90. package/dist/tests/multi_ne/sync-agent/member.test.d.ts.map +1 -0
  91. package/dist/tests/multi_ne/sync-agent/member.test.js +20 -0
  92. package/dist/tests/multi_ne/sync-agent/member.test.js.map +1 -0
  93. package/dist/tests/multi_ne/sync-agent/members.test.d.ts +2 -0
  94. package/dist/tests/multi_ne/sync-agent/members.test.d.ts.map +1 -0
  95. package/dist/tests/multi_ne/sync-agent/members.test.js +35 -0
  96. package/dist/tests/multi_ne/sync-agent/members.test.js.map +1 -0
  97. package/dist/tests/multi_ne/sync-agent/riverConnection.test.d.ts +5 -0
  98. package/dist/tests/multi_ne/sync-agent/riverConnection.test.d.ts.map +1 -0
  99. package/dist/tests/multi_ne/sync-agent/riverConnection.test.js +39 -0
  100. package/dist/tests/multi_ne/sync-agent/riverConnection.test.js.map +1 -0
  101. package/dist/tests/multi_ne/sync-agent/spaces.test.d.ts +2 -0
  102. package/dist/tests/multi_ne/sync-agent/spaces.test.d.ts.map +1 -0
  103. package/dist/tests/multi_ne/sync-agent/spaces.test.js +33 -0
  104. package/dist/tests/multi_ne/sync-agent/spaces.test.js.map +1 -0
  105. package/dist/tests/multi_ne/sync-agent/streams.test.d.ts +2 -0
  106. package/dist/tests/multi_ne/sync-agent/streams.test.d.ts.map +1 -0
  107. package/dist/tests/multi_ne/sync-agent/streams.test.js +27 -0
  108. package/dist/tests/multi_ne/sync-agent/streams.test.js.map +1 -0
  109. package/dist/tests/multi_ne/sync-agent/syncAgent.test.d.ts +2 -0
  110. package/dist/tests/multi_ne/sync-agent/syncAgent.test.d.ts.map +1 -0
  111. package/dist/tests/multi_ne/sync-agent/syncAgent.test.js +58 -0
  112. package/dist/tests/multi_ne/sync-agent/syncAgent.test.js.map +1 -0
  113. package/dist/tests/multi_ne/sync-agent/syncAgents.test.d.ts +2 -0
  114. package/dist/tests/multi_ne/sync-agent/syncAgents.test.d.ts.map +1 -0
  115. package/dist/tests/multi_ne/sync-agent/syncAgents.test.js +153 -0
  116. package/dist/tests/multi_ne/sync-agent/syncAgents.test.js.map +1 -0
  117. package/dist/tests/multi_ne/sync-agent/timeline.test.d.ts +2 -0
  118. package/dist/tests/multi_ne/sync-agent/timeline.test.d.ts.map +1 -0
  119. package/dist/tests/multi_ne/sync-agent/timeline.test.js +206 -0
  120. package/dist/tests/multi_ne/sync-agent/timeline.test.js.map +1 -0
  121. package/dist/tests/multi_ne/sync-agent/user.test.d.ts +5 -0
  122. package/dist/tests/multi_ne/sync-agent/user.test.d.ts.map +1 -0
  123. package/dist/tests/multi_ne/sync-agent/user.test.js +48 -0
  124. package/dist/tests/multi_ne/sync-agent/user.test.js.map +1 -0
  125. package/dist/views/models/timelineEvent.d.ts.map +1 -1
  126. package/dist/views/models/timelineEvent.js +153 -1
  127. package/dist/views/models/timelineEvent.js.map +1 -1
  128. package/dist/views/models/timelineTypes.d.ts +48 -1
  129. package/dist/views/models/timelineTypes.d.ts.map +1 -1
  130. package/dist/views/models/timelineTypes.js +3 -0
  131. package/dist/views/models/timelineTypes.js.map +1 -1
  132. package/dist/views/streams/userInboxStreams.d.ts +3 -0
  133. package/dist/views/streams/userInboxStreams.d.ts.map +1 -1
  134. package/dist/views/streams/userInboxStreams.js +15 -4
  135. package/dist/views/streams/userInboxStreams.js.map +1 -1
  136. package/dist/views/streams/userMetadataStreams.d.ts +3 -0
  137. package/dist/views/streams/userMetadataStreams.d.ts.map +1 -1
  138. package/dist/views/streams/userMetadataStreams.js +15 -4
  139. package/dist/views/streams/userMetadataStreams.js.map +1 -1
  140. package/dist/views/streams/userSettingsStreams.d.ts +3 -0
  141. package/dist/views/streams/userSettingsStreams.d.ts.map +1 -1
  142. package/dist/views/streams/userSettingsStreams.js +17 -6
  143. package/dist/views/streams/userSettingsStreams.js.map +1 -1
  144. package/dist/views/streams/userStreamsView.d.ts +3 -0
  145. package/dist/views/streams/userStreamsView.d.ts.map +1 -1
  146. package/dist/views/streams/userStreamsView.js +21 -10
  147. package/dist/views/streams/userStreamsView.js.map +1 -1
  148. package/package.json +10 -9
  149. package/dist/sync-agent/db.d.ts +0 -18
  150. package/dist/sync-agent/db.d.ts.map +0 -1
  151. package/dist/sync-agent/db.js +0 -34
  152. package/dist/sync-agent/db.js.map +0 -1
  153. package/dist/sync-agent/river-connection/models/transactionalClient.d.ts +0 -11
  154. package/dist/sync-agent/river-connection/models/transactionalClient.d.ts.map +0 -1
  155. package/dist/sync-agent/river-connection/models/transactionalClient.js +0 -14
  156. package/dist/sync-agent/river-connection/models/transactionalClient.js.map +0 -1
@@ -0,0 +1,206 @@
1
+ import { findMessageByText, waitFor } from '../../testUtils';
2
+ import { Bot } from '../../../sync-agent/utils/bot';
3
+ import { RiverTimelineEvent } from '../../../views/models/timelineTypes';
4
+ import { dlog } from '@towns-labs/utils';
5
+ const log = dlog('test:timeline.test.ts');
6
+ const setupTest = async () => {
7
+ const bobUser = new Bot();
8
+ const aliceUser = new Bot();
9
+ const charlieUser = new Bot();
10
+ await Promise.all([bobUser.fundWallet(), aliceUser.fundWallet(), charlieUser.fundWallet()]);
11
+ const [bob, alice, charlie] = await Promise.all([
12
+ bobUser.makeSyncAgent(),
13
+ aliceUser.makeSyncAgent(),
14
+ charlieUser.makeSyncAgent(),
15
+ ]);
16
+ return { bob, alice, charlie, bobUser, aliceUser, charlieUser };
17
+ };
18
+ describe('timeline.test.ts', () => {
19
+ test.concurrent('send and receive a mention', async () => {
20
+ const { bob, alice, aliceUser } = await setupTest();
21
+ await Promise.all([bob.start(), alice.start()]);
22
+ const { spaceId } = await bob.spaces.createSpace();
23
+ expect(bob.user.memberships.isJoined(spaceId)).toBe(true);
24
+ await alice.spaces.getSpace(spaceId).join(aliceUser.signer);
25
+ const aliceChannel = alice.spaces.getSpace(spaceId).getDefaultChannel();
26
+ expect(alice.user.memberships.isJoined(spaceId)).toBe(true);
27
+ await aliceChannel.sendMessage('Hi @bob', {
28
+ mentions: [
29
+ {
30
+ userId: bob.userId,
31
+ displayName: 'bob',
32
+ mentionBehavior: { case: undefined, value: undefined }, // geez
33
+ },
34
+ ],
35
+ });
36
+ const bobChannel = bob.spaces.getSpace(spaceId).getDefaultChannel();
37
+ // bob should receive the message
38
+ await waitFor(async () => {
39
+ const e = findMessageByText(bobChannel.timeline.events.value, 'Hi @bob');
40
+ expect(e?.content?.kind === RiverTimelineEvent.ChannelMessage &&
41
+ e?.content?.body === 'Hi @bob' &&
42
+ e?.content?.mentions != undefined &&
43
+ e?.content?.mentions.length > 0 &&
44
+ e?.content?.mentions[0].userId === bob.userId &&
45
+ e?.content?.mentions[0].displayName === 'bob', `mention: ${bobChannel.value.id}`).toEqual(true);
46
+ });
47
+ });
48
+ // aellis 2025-01-25: this test is flaky and fails intermittently
49
+ test.skip('scrollback', async () => {
50
+ const NUM_MESSAGES = 100;
51
+ const { bob, alice, aliceUser } = await setupTest();
52
+ await Promise.all([bob.start(), alice.start()]);
53
+ const { spaceId } = await bob.spaces.createSpace();
54
+ const bobChannel = bob.spaces.getSpace(spaceId).getDefaultChannel();
55
+ for (let i = 0; i < NUM_MESSAGES; i++) {
56
+ await bobChannel.sendMessage(`message ${i}`);
57
+ // force miniblocks, if we're going fast it's possible that the miniblock is not created
58
+ if ((i % NUM_MESSAGES) / 4 == 0) {
59
+ await bob.riverConnection.client?.debugForceMakeMiniblock(bobChannel.value.id, {
60
+ forceSnapshot: true,
61
+ });
62
+ }
63
+ }
64
+ // alice joins the room
65
+ await alice.spaces.getSpace(spaceId).join(aliceUser.signer);
66
+ const aliceChannel = alice.spaces.getSpace(spaceId).getDefaultChannel();
67
+ // alice shouldnt receive all the messages, only a few
68
+ expect(aliceChannel.timeline.events.value.length).toBeLessThan(NUM_MESSAGES);
69
+ const aliceChannelLength = aliceChannel.timeline.events.value.length;
70
+ // call scrollback
71
+ await aliceChannel.timeline.scrollback();
72
+ // did we get more events?
73
+ await waitFor(() => expect(aliceChannel.timeline.events.value.length).toBeGreaterThanOrEqual(aliceChannelLength));
74
+ });
75
+ test.concurrent('three users in a room', async () => {
76
+ const { bob, alice, charlie, aliceUser, charlieUser } = await setupTest();
77
+ await Promise.all([bob.start(), alice.start(), charlie.start()]);
78
+ // bob creates a space
79
+ const { spaceId } = await bob.spaces.createSpace();
80
+ const bobSpace = bob.spaces.getSpace(spaceId);
81
+ // create a channel
82
+ // const channelId = await bobSpace.createChannel('Vault 🔒', bobUser.signer)
83
+ // Join the space and channel
84
+ await Promise.all([
85
+ alice.spaces.getSpace(spaceId).join(aliceUser.signer),
86
+ charlie.spaces.getSpace(spaceId).join(charlieUser.signer),
87
+ ]);
88
+ // TODO: join channel by id
89
+ const aliceChannel = alice.spaces.getSpace(spaceId).getDefaultChannel();
90
+ const charlieChannel = charlie.spaces.getSpace(spaceId).getDefaultChannel();
91
+ const bobChannel = bobSpace.getDefaultChannel();
92
+ // Confirm that the members are in
93
+ await waitFor(() => {
94
+ const members = bobChannel.members.value;
95
+ expect(members.initialized).toBe(true);
96
+ expect(members.userIds.length).toBe(3);
97
+ });
98
+ await bobChannel.sendMessage('hey everyone!');
99
+ // everyone should receive the message
100
+ await Promise.all([
101
+ waitFor(() => {
102
+ log('aliceChannel.timeline.events.value', aliceChannel.timeline.events.value);
103
+ expect(findMessageByText(aliceChannel.timeline.events.value, 'hey everyone!')).toBeTruthy();
104
+ }),
105
+ waitFor(() => expect(findMessageByText(charlieChannel.timeline.events.value, 'hey everyone!')).toBeTruthy()),
106
+ ]);
107
+ // everyone sends a message to the room
108
+ await Promise.all([
109
+ aliceChannel.sendMessage('Hello Bob from Alice!'),
110
+ charlieChannel.sendMessage('Hello Bob from Charlie!'),
111
+ ]);
112
+ // bob should receive the messages
113
+ await waitFor(() => {
114
+ expect(findMessageByText(bobChannel.timeline.events.value, 'Hello Bob from Alice!')).toBeTruthy();
115
+ expect(findMessageByText(bobChannel.timeline.events.value, 'Hello Bob from Charlie!')).toBeTruthy();
116
+ });
117
+ });
118
+ test.concurrent('create room, send message, send a reaction and redact', async () => {
119
+ const { bob, alice, aliceUser } = await setupTest();
120
+ await Promise.all([bob.start(), alice.start()]);
121
+ const { spaceId } = await bob.spaces.createSpace();
122
+ const bobChannel = bob.spaces.getSpace(spaceId).getDefaultChannel();
123
+ await alice.spaces.getSpace(spaceId).join(aliceUser.signer);
124
+ const aliceChannel = alice.spaces.getSpace(spaceId).getDefaultChannel();
125
+ // bob sends a message to the room
126
+ await bobChannel.sendMessage('hey!');
127
+ // wait for alice to receive the message
128
+ await waitFor(async () => {
129
+ const event = findMessageByText(aliceChannel.timeline.events.value, 'hey!');
130
+ expect(event?.content?.kind === RiverTimelineEvent.ChannelMessage &&
131
+ event?.content?.body === 'hey!', `find hey message: ${aliceChannel.value.id}`).toEqual(true);
132
+ }, { timeoutMS: 20000 });
133
+ // alice grabs the message
134
+ const messageEvent = findMessageByText(aliceChannel.timeline.events.value, 'hey!');
135
+ expect(messageEvent).toBeTruthy();
136
+ // alice sends a reaction
137
+ const { eventId: reactionEventId } = await aliceChannel.sendReaction(messageEvent.eventId, '👍');
138
+ // wait for bob to receive the reaction
139
+ await waitFor(async () => {
140
+ const reaction = bobChannel.timeline.reactions.value[messageEvent.eventId];
141
+ expect(reaction).toBeTruthy();
142
+ expect(reaction?.['👍']).toBeTruthy();
143
+ expect(reaction?.['👍'][alice.userId].eventId).toEqual(reactionEventId);
144
+ });
145
+ // alice deletes the reaction
146
+ await aliceChannel.redact(reactionEventId);
147
+ // wait for bob to no longer see the reaction
148
+ await waitFor(() => {
149
+ const reaction = bobChannel.timeline.reactions.value[messageEvent.eventId];
150
+ expect(reaction).toStrictEqual({});
151
+ });
152
+ });
153
+ test.concurrent('create room, invite user, accept invite, and send threadded message', async () => {
154
+ const { bob, alice, aliceUser } = await setupTest();
155
+ await Promise.all([bob.start(), alice.start()]);
156
+ const { spaceId } = await bob.spaces.createSpace();
157
+ const bobChannel = bob.spaces.getSpace(spaceId).getDefaultChannel();
158
+ await alice.spaces.getSpace(spaceId).join(aliceUser.signer);
159
+ const aliceChannel = alice.spaces.getSpace(spaceId).getDefaultChannel();
160
+ // bob sends a message to the room
161
+ await bobChannel.sendMessage('hey alice, ready to sew?');
162
+ // wait for alice to receive the message
163
+ await waitFor(async () => {
164
+ const events = aliceChannel.timeline.events.value.map((e) => ({
165
+ kind: e.content?.kind,
166
+ body: e.content?.kind === RiverTimelineEvent.ChannelMessage
167
+ ? e.content?.body
168
+ : undefined,
169
+ }));
170
+ expect(events, `find ready to sew: ${aliceChannel.value.id}`).toContainEqual({
171
+ kind: RiverTimelineEvent.ChannelMessage,
172
+ body: 'hey alice, ready to sew?',
173
+ });
174
+ }, { timeoutMS: 20000 });
175
+ const event = aliceChannel.timeline.events.value.find((event) => event.content?.kind === RiverTimelineEvent.ChannelMessage);
176
+ // a non threaded message should not have a thread parent id
177
+ expect(event?.threadParentId).toBeUndefined();
178
+ // alice sends a threaded reply room
179
+ const firstReply = await aliceChannel.sendMessage('yey lesgo!', {
180
+ threadId: event.eventId,
181
+ });
182
+ const secondReply = await aliceChannel.sendMessage('i was planning to make a hat', {
183
+ threadId: event.eventId,
184
+ });
185
+ // bob should receive the message in the thread and the thread id should be set to parent event id
186
+ await waitFor(() => {
187
+ const thread = bobChannel.timeline.threads.value[event.eventId];
188
+ expect(thread).toBeTruthy();
189
+ expect(thread?.find((e) => e.eventId === firstReply.eventId)?.content?.kind ===
190
+ RiverTimelineEvent.ChannelMessage, `find first reply ${bobChannel.value.id}`).toBeTruthy();
191
+ expect(thread?.find((e) => e.eventId === secondReply.eventId)?.content?.kind ===
192
+ RiverTimelineEvent.ChannelMessage, `find second reply ${bobChannel.value.id}`).toBeTruthy();
193
+ });
194
+ // alice deletes the first reply
195
+ await aliceChannel.redact(firstReply.eventId);
196
+ // bob should no longer see the first reply
197
+ await waitFor(() => {
198
+ const thread = bobChannel.timeline.threads.value[event.eventId];
199
+ expect(thread.find((e) => e.eventId === firstReply.eventId)?.content?.kind ===
200
+ RiverTimelineEvent.RedactedEvent, `find first reply redacted ${bobChannel.value.id}`).toBeTruthy();
201
+ expect(thread.find((e) => e.eventId === secondReply.eventId)?.content?.kind ===
202
+ RiverTimelineEvent.ChannelMessage, `find second reply not redacted ${bobChannel.value.id}`).toBeTruthy();
203
+ });
204
+ });
205
+ });
206
+ //# sourceMappingURL=timeline.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline.test.js","sourceRoot":"","sources":["../../../../src/tests/multi_ne/sync-agent/timeline.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @group with-entitlements
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=user.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/multi_ne/sync-agent/user.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * @group with-entitlements
3
+ */
4
+ import { dlogger } from '@towns-labs/utils';
5
+ import { Bot } from '../../../sync-agent/utils/bot';
6
+ import { waitFor } from '../../testUtils';
7
+ const logger = dlogger('csb:test:user');
8
+ describe('User.test.ts', () => {
9
+ logger.log('start');
10
+ const testUser = new Bot();
11
+ beforeEach(async () => {
12
+ await testUser.fundWallet();
13
+ });
14
+ test('User initializes', async () => {
15
+ const syncAgent = await testUser.makeSyncAgent();
16
+ const user = syncAgent.user;
17
+ const spaces = syncAgent.spaces;
18
+ expect(user.id).toBe(testUser.userId);
19
+ expect(user.memberships.value.initialized).toBe(false);
20
+ expect(user.inbox.value.initialized).toBe(false);
21
+ expect(user.deviceKeys.value.initialized).toBe(false);
22
+ expect(user.settings.value.initialized).toBe(false);
23
+ await syncAgent.start();
24
+ expect(user.id).toBe(testUser.userId);
25
+ await waitFor(() => expect(user.memberships.value.initialized).toBe(true));
26
+ await waitFor(() => expect(user.inbox.value.initialized).toBe(true));
27
+ await waitFor(() => expect(user.deviceKeys.value.initialized).toBe(true));
28
+ await waitFor(() => expect(user.settings.value.initialized).toBe(true));
29
+ const { spaceId } = await spaces.createSpace();
30
+ logger.log('created spaceId', spaceId);
31
+ expect(user.memberships.value.initialized).toBe(true);
32
+ expect(user.inbox.value.initialized).toBe(true);
33
+ expect(user.deviceKeys.value.initialized).toBe(true);
34
+ expect(user.settings.value.initialized).toBe(true);
35
+ await syncAgent.stop();
36
+ });
37
+ test('User loads from db', async () => {
38
+ const syncAgent = await testUser.makeSyncAgent();
39
+ const user = syncAgent.user;
40
+ await syncAgent.start();
41
+ await waitFor(() => expect(user.memberships.value.initialized).toBe(true));
42
+ await waitFor(() => expect(user.inbox.value.initialized).toBe(true));
43
+ await waitFor(() => expect(user.deviceKeys.value.initialized).toBe(true));
44
+ await waitFor(() => expect(user.settings.value.initialized).toBe(true));
45
+ await syncAgent.stop();
46
+ });
47
+ });
48
+ //# sourceMappingURL=user.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.test.js","sourceRoot":"","sources":["../../../../src/tests/multi_ne/sync-agent/user.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAC3C,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAEzC,MAAM,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAA;AAEvC,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC1B,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IACnB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAA;IAE1B,UAAU,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAA;IAC/B,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,kBAAkB,EAAE,KAAK,IAAI,EAAE;QAChC,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,aAAa,EAAE,CAAA;QAChD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAA;QAC3B,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAA;QAC/B,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;QACrC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACtD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAChD,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACrD,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAEnD,MAAM,SAAS,CAAC,KAAK,EAAE,CAAA;QACvB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;QACrC,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAC1E,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACpE,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACzE,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAEvE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAA;QAC9C,MAAM,CAAC,GAAG,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAA;QAEtC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACrD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC/C,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACpD,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAClD,MAAM,SAAS,CAAC,IAAI,EAAE,CAAA;IAC1B,CAAC,CAAC,CAAA;IACF,IAAI,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;QAClC,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,aAAa,EAAE,CAAA;QAChD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAA;QAC3B,MAAM,SAAS,CAAC,KAAK,EAAE,CAAA;QACvB,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAC1E,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACpE,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACzE,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACvE,MAAM,SAAS,CAAC,IAAI,EAAE,CAAA;IAC1B,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"timelineEvent.d.ts","sourceRoot":"","sources":["../../../src/views/models/timelineEvent.ts"],"names":[],"mappings":"AAAA,OAAO,EAYH,YAAY,EAGf,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACH,aAAa,EAUb,mBAAmB,EA2BnB,UAAU,EASb,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAKH,mBAAmB,EACtB,MAAM,aAAa,CAAA;AAIpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAA;AAgBnE,wBAAgB,OAAO,CAAC,aAAa,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,CAsCzF;AA23BD,wBAAgB,gBAAgB,CAC5B,KAAK,EAAE,aAAa,EACpB,gBAAgB,EAAE,gBAAgB,EAClC,MAAM,EAAE,MAAM,GACf,aAAa,CAoJf;AAED,wBAAgB,4BAA4B,CACxC,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,sBAAsB,GAC9B,aAAa,CAcf;AAED,wBAAgB,YAAY,CAAC,YAAY,CAAC,EAAE,YAAY,GAAG,UAAU,CAepE;AAED,wBAAgB,kBAAkB,CAC9B,iBAAiB,EAAE,MAAM,EACzB,OAAO,CAAC,EAAE,mBAAmB,EAC7B,KAAK,CAAC,EAAE,MAAM,GACf,MAAM,CAoGR"}
1
+ {"version":3,"file":"timelineEvent.d.ts","sourceRoot":"","sources":["../../../src/views/models/timelineEvent.ts"],"names":[],"mappings":"AAAA,OAAO,EAYH,YAAY,EAKf,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACH,aAAa,EAUb,mBAAmB,EA2BnB,UAAU,EAab,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAKH,mBAAmB,EACtB,MAAM,aAAa,CAAA;AAIpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAA;AAgBnE,wBAAgB,OAAO,CAAC,aAAa,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,CAsCzF;AAgiCD,wBAAgB,gBAAgB,CAC5B,KAAK,EAAE,aAAa,EACpB,gBAAgB,EAAE,gBAAgB,EAClC,MAAM,EAAE,MAAM,GACf,aAAa,CAoJf;AAED,wBAAgB,4BAA4B,CACxC,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,sBAAsB,GAC9B,aAAa,CAcf;AAED,wBAAgB,YAAY,CAAC,YAAY,CAAC,EAAE,YAAY,GAAG,UAAU,CAepE;AAED,wBAAgB,kBAAkB,CAC9B,iBAAiB,EAAE,MAAM,EACzB,OAAO,CAAC,EAAE,mBAAmB,EAC7B,KAAK,CAAC,EAAE,MAAM,GACf,MAAM,CAoGR"}
@@ -1,4 +1,4 @@
1
- import { MembershipOp, } from '@towns-labs/proto';
1
+ import { MembershipOp, ChannelMessage_Post_Content_InfoCard_Label_Icon, ChannelMessage_Post_Content_InfoCard_Label_Badge_Variant, } from '@towns-labs/proto';
2
2
  import { EventStatus, RiverTimelineEvent, MessageType, Membership, getIsMentioned, getReactionParentId, getReplyParentId, getThreadParentId, } from './timelineTypes';
3
3
  import { checkNever, isDefined, logNever } from '../../check';
4
4
  import { isLocalEvent, isRemoteEvent, } from '../../types';
@@ -586,6 +586,39 @@ function toTownsContent_ChannelPayload_Message_Post(value, eventId, editsEventId
586
586
  },
587
587
  },
588
588
  };
589
+ // Dummy for now for completeness - to be polished later
590
+ case 'conversationSeed':
591
+ return {
592
+ content: {
593
+ kind: RiverTimelineEvent.ChannelMessage,
594
+ body: toConversationSeedBody(value.content.value),
595
+ threadId: value.threadId,
596
+ threadPreview: value.threadPreview,
597
+ replyId: value.replyId,
598
+ replyPreview: value.replyPreview,
599
+ mentions: [],
600
+ editsEventId: editsEventId,
601
+ content: {
602
+ msgType: MessageType.Text,
603
+ },
604
+ },
605
+ };
606
+ case 'conversationSeedResponse':
607
+ return {
608
+ content: {
609
+ kind: RiverTimelineEvent.ChannelMessage,
610
+ body: toConversationSeedResponseBody(value.content.value),
611
+ threadId: value.threadId,
612
+ threadPreview: value.threadPreview,
613
+ replyId: value.replyId,
614
+ replyPreview: value.replyPreview,
615
+ mentions: [],
616
+ editsEventId: editsEventId,
617
+ content: {
618
+ msgType: MessageType.Text,
619
+ },
620
+ },
621
+ };
589
622
  case undefined:
590
623
  return { error: `Undefined payload case: ${description}` };
591
624
  default:
@@ -593,6 +626,38 @@ function toTownsContent_ChannelPayload_Message_Post(value, eventId, editsEventId
593
626
  return { error: `Unknown payload case: ${description}` };
594
627
  }
595
628
  }
629
+ function toConversationSeedBody(seed) {
630
+ if (!('responseText' in seed)) {
631
+ return 'Conversation seed';
632
+ }
633
+ const responseText = seed.responseText?.trim();
634
+ if (responseText) {
635
+ return responseText;
636
+ }
637
+ const query = seed.query?.trim();
638
+ if (query) {
639
+ return `Concierge seed: ${query}`;
640
+ }
641
+ const proposalCount = seed.proposals?.length ?? 0;
642
+ const questionCount = seed.clarifyingQuestions?.length ?? 0;
643
+ return `Concierge seed (${proposalCount} proposal${proposalCount === 1 ? '' : 's'}, ${questionCount} question${questionCount === 1 ? '' : 's'})`;
644
+ }
645
+ function toConversationSeedResponseBody(response) {
646
+ if (!('seedId' in response)) {
647
+ return 'Conversation seed response';
648
+ }
649
+ switch (response.response.case) {
650
+ case 'selectedProposal':
651
+ return `Selected proposal: ${response.response.value.id}`;
652
+ case 'userMessage':
653
+ return response.response.value;
654
+ case undefined:
655
+ return 'Conversation seed response';
656
+ default:
657
+ logNever(response.response);
658
+ return 'Conversation seed response';
659
+ }
660
+ }
596
661
  function toTownsContent_SpacePayload(eventId, message, value, description) {
597
662
  switch (value.content.case) {
598
663
  case 'inception': {
@@ -771,6 +836,93 @@ function toAttachment(attachment, parentEventId, index) {
771
836
  id,
772
837
  };
773
838
  }
839
+ case 'infoCard': {
840
+ const content = attachment.content.value;
841
+ const mapIcon = (icon) => {
842
+ switch (icon) {
843
+ case ChannelMessage_Post_Content_InfoCard_Label_Icon.CHECK:
844
+ return 'check';
845
+ case ChannelMessage_Post_Content_InfoCard_Label_Icon.X:
846
+ return 'x';
847
+ case ChannelMessage_Post_Content_InfoCard_Label_Icon.WARNING:
848
+ return 'warning';
849
+ case ChannelMessage_Post_Content_InfoCard_Label_Icon.INFO:
850
+ return 'info';
851
+ default:
852
+ return undefined;
853
+ }
854
+ };
855
+ const mapVariant = (v) => {
856
+ switch (v) {
857
+ case ChannelMessage_Post_Content_InfoCard_Label_Badge_Variant.POSITIVE:
858
+ return 'positive';
859
+ case ChannelMessage_Post_Content_InfoCard_Label_Badge_Variant.NEGATIVE:
860
+ return 'negative';
861
+ default:
862
+ return undefined;
863
+ }
864
+ };
865
+ const mapLabel = (label) => {
866
+ if (!label)
867
+ return undefined;
868
+ return {
869
+ icon: mapIcon(label.icon),
870
+ text: label.text,
871
+ badge: label.badge
872
+ ? { text: label.badge.text, variant: mapVariant(label.badge.variant) }
873
+ : undefined,
874
+ };
875
+ };
876
+ const fields = content.fields.map((f) => {
877
+ let value;
878
+ switch (f.value.case) {
879
+ case 'text':
880
+ value = { type: 'text', label: mapLabel(f.value.value) ?? { text: '' } };
881
+ break;
882
+ case 'user':
883
+ value = { type: 'user', userId: f.value.value.userId };
884
+ break;
885
+ case 'token':
886
+ value = {
887
+ type: 'token',
888
+ chainId: f.value.value.chainId,
889
+ address: f.value.value.address,
890
+ amount: f.value.value.amount,
891
+ };
892
+ break;
893
+ case 'contract':
894
+ value = {
895
+ type: 'contract',
896
+ chainId: f.value.value.chainId,
897
+ address: f.value.value.address,
898
+ };
899
+ break;
900
+ case 'marketItem': {
901
+ const mi = f.value.value;
902
+ const item = {
903
+ name: mi.name,
904
+ price: mi.price,
905
+ iconUrl: mi.iconUrl,
906
+ subtitle: mi.subtitle,
907
+ change: mi.change,
908
+ changePct: mi.changePct,
909
+ direction: mapVariant(mi.direction),
910
+ };
911
+ value = { type: 'marketItem', item };
912
+ break;
913
+ }
914
+ default:
915
+ value = { type: 'text', label: { text: '' } };
916
+ }
917
+ return { label: f.label, value };
918
+ });
919
+ return {
920
+ type: 'infoCard',
921
+ id,
922
+ title: mapLabel(content.title),
923
+ fields,
924
+ };
925
+ }
774
926
  default:
775
927
  return undefined;
776
928
  }