@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.
- package/dist/client.d.ts +3 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +45 -1
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -2
- package/dist/index.js.map +1 -1
- package/dist/streamStateView_User.d.ts.map +1 -1
- package/dist/streamStateView_User.js +1 -0
- package/dist/streamStateView_User.js.map +1 -1
- package/dist/streamStateView_UserInbox.d.ts.map +1 -1
- package/dist/streamStateView_UserInbox.js +1 -0
- package/dist/streamStateView_UserInbox.js.map +1 -1
- package/dist/streamStateView_UserMetadata.d.ts.map +1 -1
- package/dist/streamStateView_UserMetadata.js +1 -0
- package/dist/streamStateView_UserMetadata.js.map +1 -1
- package/dist/streamStateView_UserSettings.d.ts.map +1 -1
- package/dist/streamStateView_UserSettings.js +9 -1
- package/dist/streamStateView_UserSettings.js.map +1 -1
- package/dist/sync-agent/dms/dms.d.ts +5 -5
- package/dist/sync-agent/dms/dms.d.ts.map +1 -1
- package/dist/sync-agent/dms/dms.js +12 -27
- package/dist/sync-agent/dms/dms.js.map +1 -1
- package/dist/sync-agent/dms/models/dm.d.ts +4 -5
- package/dist/sync-agent/dms/models/dm.d.ts.map +1 -1
- package/dist/sync-agent/dms/models/dm.js +28 -34
- package/dist/sync-agent/dms/models/dm.js.map +1 -1
- package/dist/sync-agent/gdms/gdms.d.ts +5 -6
- package/dist/sync-agent/gdms/gdms.d.ts.map +1 -1
- package/dist/sync-agent/gdms/gdms.js +12 -27
- package/dist/sync-agent/gdms/gdms.js.map +1 -1
- package/dist/sync-agent/gdms/models/gdm.d.ts +7 -5
- package/dist/sync-agent/gdms/models/gdm.d.ts.map +1 -1
- package/dist/sync-agent/gdms/models/gdm.js +29 -34
- package/dist/sync-agent/gdms/models/gdm.js.map +1 -1
- package/dist/sync-agent/members/members.d.ts +6 -18
- package/dist/sync-agent/members/members.d.ts.map +1 -1
- package/dist/sync-agent/members/members.js +25 -124
- package/dist/sync-agent/members/members.js.map +1 -1
- package/dist/sync-agent/members/models/member.d.ts +3 -45
- package/dist/sync-agent/members/models/member.d.ts.map +1 -1
- package/dist/sync-agent/members/models/member.js +15 -114
- package/dist/sync-agent/members/models/member.js.map +1 -1
- package/dist/sync-agent/members/models/myself.d.ts +1 -11
- package/dist/sync-agent/members/models/myself.d.ts.map +1 -1
- package/dist/sync-agent/members/models/myself.js +1 -84
- package/dist/sync-agent/members/models/myself.js.map +1 -1
- package/dist/sync-agent/river-connection/riverConnection.d.ts +5 -11
- package/dist/sync-agent/river-connection/riverConnection.d.ts.map +1 -1
- package/dist/sync-agent/river-connection/riverConnection.js +27 -29
- package/dist/sync-agent/river-connection/riverConnection.js.map +1 -1
- package/dist/sync-agent/spaces/models/channel.d.ts +7 -26
- package/dist/sync-agent/spaces/models/channel.d.ts.map +1 -1
- package/dist/sync-agent/spaces/models/channel.js +24 -37
- package/dist/sync-agent/spaces/models/channel.js.map +1 -1
- package/dist/sync-agent/spaces/models/space.d.ts +4 -5
- package/dist/sync-agent/spaces/models/space.d.ts.map +1 -1
- package/dist/sync-agent/spaces/models/space.js +27 -37
- package/dist/sync-agent/spaces/models/space.js.map +1 -1
- package/dist/sync-agent/spaces/spaces.d.ts +8 -11
- package/dist/sync-agent/spaces/spaces.d.ts.map +1 -1
- package/dist/sync-agent/spaces/spaces.js +13 -28
- package/dist/sync-agent/spaces/spaces.js.map +1 -1
- package/dist/sync-agent/syncAgent.d.ts +13 -18
- package/dist/sync-agent/syncAgent.d.ts.map +1 -1
- package/dist/sync-agent/syncAgent.js +5 -14
- package/dist/sync-agent/syncAgent.js.map +1 -1
- package/dist/sync-agent/user/models/userInbox.d.ts +4 -17
- package/dist/sync-agent/user/models/userInbox.d.ts.map +1 -1
- package/dist/sync-agent/user/models/userInbox.js +14 -61
- package/dist/sync-agent/user/models/userInbox.js.map +1 -1
- package/dist/sync-agent/user/models/userMemberships.d.ts +6 -22
- package/dist/sync-agent/user/models/userMemberships.d.ts.map +1 -1
- package/dist/sync-agent/user/models/userMemberships.js +16 -68
- package/dist/sync-agent/user/models/userMemberships.js.map +1 -1
- package/dist/sync-agent/user/models/userMetadata.d.ts +4 -17
- package/dist/sync-agent/user/models/userMetadata.d.ts.map +1 -1
- package/dist/sync-agent/user/models/userMetadata.js +14 -61
- package/dist/sync-agent/user/models/userMetadata.js.map +1 -1
- package/dist/sync-agent/user/models/userSettings.d.ts +5 -8
- package/dist/sync-agent/user/models/userSettings.d.ts.map +1 -1
- package/dist/sync-agent/user/models/userSettings.js +15 -42
- package/dist/sync-agent/user/models/userSettings.js.map +1 -1
- package/dist/sync-agent/user/user.d.ts +2 -6
- package/dist/sync-agent/user/user.d.ts.map +1 -1
- package/dist/sync-agent/user/user.js +9 -20
- package/dist/sync-agent/user/user.js.map +1 -1
- package/dist/tests/multi_ne/sync-agent/member.test.d.ts +2 -0
- package/dist/tests/multi_ne/sync-agent/member.test.d.ts.map +1 -0
- package/dist/tests/multi_ne/sync-agent/member.test.js +20 -0
- package/dist/tests/multi_ne/sync-agent/member.test.js.map +1 -0
- package/dist/tests/multi_ne/sync-agent/members.test.d.ts +2 -0
- package/dist/tests/multi_ne/sync-agent/members.test.d.ts.map +1 -0
- package/dist/tests/multi_ne/sync-agent/members.test.js +35 -0
- package/dist/tests/multi_ne/sync-agent/members.test.js.map +1 -0
- package/dist/tests/multi_ne/sync-agent/riverConnection.test.d.ts +5 -0
- package/dist/tests/multi_ne/sync-agent/riverConnection.test.d.ts.map +1 -0
- package/dist/tests/multi_ne/sync-agent/riverConnection.test.js +39 -0
- package/dist/tests/multi_ne/sync-agent/riverConnection.test.js.map +1 -0
- package/dist/tests/multi_ne/sync-agent/spaces.test.d.ts +2 -0
- package/dist/tests/multi_ne/sync-agent/spaces.test.d.ts.map +1 -0
- package/dist/tests/multi_ne/sync-agent/spaces.test.js +33 -0
- package/dist/tests/multi_ne/sync-agent/spaces.test.js.map +1 -0
- package/dist/tests/multi_ne/sync-agent/streams.test.d.ts +2 -0
- package/dist/tests/multi_ne/sync-agent/streams.test.d.ts.map +1 -0
- package/dist/tests/multi_ne/sync-agent/streams.test.js +27 -0
- package/dist/tests/multi_ne/sync-agent/streams.test.js.map +1 -0
- package/dist/tests/multi_ne/sync-agent/syncAgent.test.d.ts +2 -0
- package/dist/tests/multi_ne/sync-agent/syncAgent.test.d.ts.map +1 -0
- package/dist/tests/multi_ne/sync-agent/syncAgent.test.js +58 -0
- package/dist/tests/multi_ne/sync-agent/syncAgent.test.js.map +1 -0
- package/dist/tests/multi_ne/sync-agent/syncAgents.test.d.ts +2 -0
- package/dist/tests/multi_ne/sync-agent/syncAgents.test.d.ts.map +1 -0
- package/dist/tests/multi_ne/sync-agent/syncAgents.test.js +153 -0
- package/dist/tests/multi_ne/sync-agent/syncAgents.test.js.map +1 -0
- package/dist/tests/multi_ne/sync-agent/timeline.test.d.ts +2 -0
- package/dist/tests/multi_ne/sync-agent/timeline.test.d.ts.map +1 -0
- package/dist/tests/multi_ne/sync-agent/timeline.test.js +206 -0
- package/dist/tests/multi_ne/sync-agent/timeline.test.js.map +1 -0
- package/dist/tests/multi_ne/sync-agent/user.test.d.ts +5 -0
- package/dist/tests/multi_ne/sync-agent/user.test.d.ts.map +1 -0
- package/dist/tests/multi_ne/sync-agent/user.test.js +48 -0
- package/dist/tests/multi_ne/sync-agent/user.test.js.map +1 -0
- package/dist/views/models/timelineEvent.d.ts.map +1 -1
- package/dist/views/models/timelineEvent.js +153 -1
- package/dist/views/models/timelineEvent.js.map +1 -1
- package/dist/views/models/timelineTypes.d.ts +48 -1
- package/dist/views/models/timelineTypes.d.ts.map +1 -1
- package/dist/views/models/timelineTypes.js +3 -0
- package/dist/views/models/timelineTypes.js.map +1 -1
- package/dist/views/streams/userInboxStreams.d.ts +3 -0
- package/dist/views/streams/userInboxStreams.d.ts.map +1 -1
- package/dist/views/streams/userInboxStreams.js +15 -4
- package/dist/views/streams/userInboxStreams.js.map +1 -1
- package/dist/views/streams/userMetadataStreams.d.ts +3 -0
- package/dist/views/streams/userMetadataStreams.d.ts.map +1 -1
- package/dist/views/streams/userMetadataStreams.js +15 -4
- package/dist/views/streams/userMetadataStreams.js.map +1 -1
- package/dist/views/streams/userSettingsStreams.d.ts +3 -0
- package/dist/views/streams/userSettingsStreams.d.ts.map +1 -1
- package/dist/views/streams/userSettingsStreams.js +17 -6
- package/dist/views/streams/userSettingsStreams.js.map +1 -1
- package/dist/views/streams/userStreamsView.d.ts +3 -0
- package/dist/views/streams/userStreamsView.d.ts.map +1 -1
- package/dist/views/streams/userStreamsView.js +21 -10
- package/dist/views/streams/userStreamsView.js.map +1 -1
- package/package.json +10 -9
- package/dist/sync-agent/db.d.ts +0 -18
- package/dist/sync-agent/db.d.ts.map +0 -1
- package/dist/sync-agent/db.js +0 -34
- package/dist/sync-agent/db.js.map +0 -1
- package/dist/sync-agent/river-connection/models/transactionalClient.d.ts +0 -11
- package/dist/sync-agent/river-connection/models/transactionalClient.d.ts.map +0 -1
- package/dist/sync-agent/river-connection/models/transactionalClient.js +0 -14
- 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 @@
|
|
|
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":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timelineEvent.d.ts","sourceRoot":"","sources":["../../../src/views/models/timelineEvent.ts"],"names":[],"mappings":"AAAA,OAAO,EAYH,YAAY,
|
|
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
|
}
|