@massalabs/gossip-sdk 0.0.1 → 0.0.2-dev.20260128111120
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/api/messageProtocol/index.d.ts +19 -0
- package/dist/api/messageProtocol/index.js +26 -0
- package/dist/api/messageProtocol/mock.d.ts +12 -0
- package/{src/api/messageProtocol/mock.ts → dist/api/messageProtocol/mock.js} +2 -3
- package/dist/api/messageProtocol/rest.d.ts +22 -0
- package/dist/api/messageProtocol/rest.js +161 -0
- package/dist/api/messageProtocol/types.d.ts +61 -0
- package/dist/api/messageProtocol/types.js +6 -0
- package/dist/assets/generated/wasm/README.md +281 -0
- package/dist/assets/generated/wasm/gossip_wasm.d.ts +498 -0
- package/dist/assets/generated/wasm/gossip_wasm.js +1399 -0
- package/dist/assets/generated/wasm/gossip_wasm_bg.wasm +0 -0
- package/dist/assets/generated/wasm/gossip_wasm_bg.wasm.d.ts +68 -0
- package/dist/assets/generated/wasm/package.json +15 -0
- package/dist/config/protocol.d.ts +36 -0
- package/dist/config/protocol.js +77 -0
- package/dist/config/sdk.d.ts +82 -0
- package/dist/config/sdk.js +55 -0
- package/{src/contacts.ts → dist/contacts.d.ts} +10 -94
- package/dist/contacts.js +166 -0
- package/dist/core/SdkEventEmitter.d.ts +36 -0
- package/dist/core/SdkEventEmitter.js +59 -0
- package/dist/core/SdkPolling.d.ts +35 -0
- package/dist/core/SdkPolling.js +100 -0
- package/{src/core/index.ts → dist/core/index.d.ts} +0 -2
- package/dist/core/index.js +5 -0
- package/dist/crypto/bip39.d.ts +34 -0
- package/dist/crypto/bip39.js +62 -0
- package/dist/crypto/encryption.d.ts +37 -0
- package/dist/crypto/encryption.js +46 -0
- package/dist/db.d.ts +190 -0
- package/dist/db.js +311 -0
- package/dist/gossipSdk.d.ts +274 -0
- package/dist/gossipSdk.js +690 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.js +77 -0
- package/dist/services/announcement.d.ts +43 -0
- package/dist/services/announcement.js +491 -0
- package/dist/services/auth.d.ts +37 -0
- package/dist/services/auth.js +76 -0
- package/dist/services/discussion.d.ts +63 -0
- package/dist/services/discussion.js +297 -0
- package/dist/services/message.d.ts +74 -0
- package/dist/services/message.js +826 -0
- package/dist/services/refresh.d.ts +41 -0
- package/dist/services/refresh.js +205 -0
- package/{src/sw.ts → dist/sw.d.ts} +1 -8
- package/dist/sw.js +10 -0
- package/dist/types/events.d.ts +80 -0
- package/dist/types/events.js +7 -0
- package/dist/types.d.ts +32 -0
- package/dist/types.js +7 -0
- package/dist/utils/base64.d.ts +10 -0
- package/dist/utils/base64.js +30 -0
- package/dist/utils/contacts.d.ts +42 -0
- package/dist/utils/contacts.js +113 -0
- package/dist/utils/discussions.d.ts +24 -0
- package/dist/utils/discussions.js +38 -0
- package/dist/utils/logs.d.ts +19 -0
- package/dist/utils/logs.js +89 -0
- package/dist/utils/messageSerialization.d.ts +64 -0
- package/dist/utils/messageSerialization.js +184 -0
- package/dist/utils/queue.d.ts +50 -0
- package/dist/utils/queue.js +110 -0
- package/dist/utils/type.d.ts +10 -0
- package/dist/utils/type.js +4 -0
- package/dist/utils/userId.d.ts +40 -0
- package/dist/utils/userId.js +90 -0
- package/dist/utils/validation.d.ts +50 -0
- package/dist/utils/validation.js +112 -0
- package/dist/utils.d.ts +30 -0
- package/{src/utils.ts → dist/utils.js} +9 -19
- package/dist/wasm/encryption.d.ts +56 -0
- package/{src/wasm/encryption.ts → dist/wasm/encryption.js} +22 -51
- package/dist/wasm/index.d.ts +10 -0
- package/{src/wasm/index.ts → dist/wasm/index.js} +1 -8
- package/dist/wasm/loader.d.ts +21 -0
- package/dist/wasm/loader.js +103 -0
- package/dist/wasm/session.d.ts +85 -0
- package/dist/wasm/session.js +226 -0
- package/dist/wasm/userKeys.d.ts +17 -0
- package/{src/wasm/userKeys.ts → dist/wasm/userKeys.js} +6 -13
- package/package.json +5 -1
- package/src/api/messageProtocol/index.ts +0 -53
- package/src/api/messageProtocol/rest.ts +0 -209
- package/src/api/messageProtocol/types.ts +0 -70
- package/src/config/protocol.ts +0 -97
- package/src/config/sdk.ts +0 -131
- package/src/core/SdkEventEmitter.ts +0 -91
- package/src/core/SdkPolling.ts +0 -134
- package/src/crypto/bip39.ts +0 -84
- package/src/crypto/encryption.ts +0 -77
- package/src/db.ts +0 -465
- package/src/gossipSdk.ts +0 -994
- package/src/index.ts +0 -211
- package/src/services/announcement.ts +0 -653
- package/src/services/auth.ts +0 -95
- package/src/services/discussion.ts +0 -380
- package/src/services/message.ts +0 -1055
- package/src/services/refresh.ts +0 -234
- package/src/types/events.ts +0 -108
- package/src/types.ts +0 -70
- package/src/utils/base64.ts +0 -39
- package/src/utils/contacts.ts +0 -161
- package/src/utils/discussions.ts +0 -55
- package/src/utils/logs.ts +0 -86
- package/src/utils/messageSerialization.ts +0 -257
- package/src/utils/queue.ts +0 -106
- package/src/utils/type.ts +0 -7
- package/src/utils/userId.ts +0 -114
- package/src/utils/validation.ts +0 -144
- package/src/wasm/loader.ts +0 -123
- package/src/wasm/session.ts +0 -276
- package/test/config/protocol.spec.ts +0 -31
- package/test/config/sdk.spec.ts +0 -163
- package/test/db/helpers.spec.ts +0 -142
- package/test/db/operations.spec.ts +0 -128
- package/test/db/states.spec.ts +0 -535
- package/test/integration/discussion-flow.spec.ts +0 -422
- package/test/integration/messaging-flow.spec.ts +0 -708
- package/test/integration/sdk-lifecycle.spec.ts +0 -325
- package/test/mocks/index.ts +0 -9
- package/test/mocks/mockMessageProtocol.ts +0 -100
- package/test/services/auth.spec.ts +0 -311
- package/test/services/discussion.spec.ts +0 -279
- package/test/services/message-deduplication.spec.ts +0 -299
- package/test/services/message-startup.spec.ts +0 -331
- package/test/services/message.spec.ts +0 -817
- package/test/services/refresh.spec.ts +0 -199
- package/test/services/session-status.spec.ts +0 -349
- package/test/session/wasm.spec.ts +0 -227
- package/test/setup.ts +0 -52
- package/test/utils/contacts.spec.ts +0 -156
- package/test/utils/discussions.spec.ts +0 -66
- package/test/utils/queue.spec.ts +0 -52
- package/test/utils/serialization.spec.ts +0 -120
- package/test/utils/userId.spec.ts +0 -120
- package/test/utils/validation.spec.ts +0 -223
- package/test/utils.ts +0 -212
- package/tsconfig.json +0 -26
- package/tsconfig.tsbuildinfo +0 -1
- package/vitest.config.ts +0 -28
package/test/db/states.spec.ts
DELETED
|
@@ -1,535 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Database state transitions tests
|
|
3
|
-
*
|
|
4
|
-
* Tests for discussion and message state transitions, stability detection,
|
|
5
|
-
* pending announcements, and contact deletion cleanup.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { describe, it, expect, beforeEach } from 'vitest';
|
|
9
|
-
import {
|
|
10
|
-
db,
|
|
11
|
-
DiscussionDirection,
|
|
12
|
-
DiscussionStatus,
|
|
13
|
-
MessageDirection,
|
|
14
|
-
MessageStatus,
|
|
15
|
-
MessageType,
|
|
16
|
-
} from '../../src/db';
|
|
17
|
-
|
|
18
|
-
const TEST_OWNER_USER_ID = 'gossip1testowner';
|
|
19
|
-
const TEST_CONTACT_USER_ID = 'gossip1testcontact';
|
|
20
|
-
|
|
21
|
-
describe('Discussion State Transitions', () => {
|
|
22
|
-
beforeEach(async () => {
|
|
23
|
-
if (!db.isOpen()) {
|
|
24
|
-
await db.open();
|
|
25
|
-
}
|
|
26
|
-
await db.discussions.clear();
|
|
27
|
-
await db.messages.clear();
|
|
28
|
-
await db.contacts.clear();
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
describe('Discussion Direction', () => {
|
|
32
|
-
it('should track INITIATED direction when we start discussion', async () => {
|
|
33
|
-
const discussionId = await db.discussions.add({
|
|
34
|
-
ownerUserId: TEST_OWNER_USER_ID,
|
|
35
|
-
contactUserId: TEST_CONTACT_USER_ID,
|
|
36
|
-
direction: DiscussionDirection.INITIATED,
|
|
37
|
-
status: DiscussionStatus.PENDING,
|
|
38
|
-
unreadCount: 0,
|
|
39
|
-
createdAt: new Date(),
|
|
40
|
-
updatedAt: new Date(),
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
const discussion = await db.discussions.get(discussionId);
|
|
44
|
-
expect(discussion?.direction).toBe(DiscussionDirection.INITIATED);
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
it('should track RECEIVED direction when peer starts discussion', async () => {
|
|
48
|
-
const discussionId = await db.discussions.add({
|
|
49
|
-
ownerUserId: TEST_OWNER_USER_ID,
|
|
50
|
-
contactUserId: TEST_CONTACT_USER_ID,
|
|
51
|
-
direction: DiscussionDirection.RECEIVED,
|
|
52
|
-
status: DiscussionStatus.PENDING,
|
|
53
|
-
unreadCount: 0,
|
|
54
|
-
createdAt: new Date(),
|
|
55
|
-
updatedAt: new Date(),
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
const discussion = await db.discussions.get(discussionId);
|
|
59
|
-
expect(discussion?.direction).toBe(DiscussionDirection.RECEIVED);
|
|
60
|
-
});
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
describe('Status Transitions', () => {
|
|
64
|
-
it('should allow PENDING -> ACTIVE transition', async () => {
|
|
65
|
-
const discussionId = await db.discussions.add({
|
|
66
|
-
ownerUserId: TEST_OWNER_USER_ID,
|
|
67
|
-
contactUserId: TEST_CONTACT_USER_ID,
|
|
68
|
-
direction: DiscussionDirection.INITIATED,
|
|
69
|
-
status: DiscussionStatus.PENDING,
|
|
70
|
-
unreadCount: 0,
|
|
71
|
-
createdAt: new Date(),
|
|
72
|
-
updatedAt: new Date(),
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
await db.discussions.update(discussionId, {
|
|
76
|
-
status: DiscussionStatus.ACTIVE,
|
|
77
|
-
updatedAt: new Date(),
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
const discussion = await db.discussions.get(discussionId);
|
|
81
|
-
expect(discussion?.status).toBe(DiscussionStatus.ACTIVE);
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
it('should allow SEND_FAILED -> PENDING on successful retry', async () => {
|
|
85
|
-
const discussionId = await db.discussions.add({
|
|
86
|
-
ownerUserId: TEST_OWNER_USER_ID,
|
|
87
|
-
contactUserId: TEST_CONTACT_USER_ID,
|
|
88
|
-
direction: DiscussionDirection.INITIATED,
|
|
89
|
-
status: DiscussionStatus.SEND_FAILED,
|
|
90
|
-
initiationAnnouncement: new Uint8Array([1, 2, 3]),
|
|
91
|
-
unreadCount: 0,
|
|
92
|
-
createdAt: new Date(),
|
|
93
|
-
updatedAt: new Date(),
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
await db.discussions.update(discussionId, {
|
|
97
|
-
status: DiscussionStatus.PENDING,
|
|
98
|
-
updatedAt: new Date(),
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
const discussion = await db.discussions.get(discussionId);
|
|
102
|
-
expect(discussion?.status).toBe(DiscussionStatus.PENDING);
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
it('should allow ACTIVE -> BROKEN on session killed', async () => {
|
|
106
|
-
const discussionId = await db.discussions.add({
|
|
107
|
-
ownerUserId: TEST_OWNER_USER_ID,
|
|
108
|
-
contactUserId: TEST_CONTACT_USER_ID,
|
|
109
|
-
direction: DiscussionDirection.INITIATED,
|
|
110
|
-
status: DiscussionStatus.ACTIVE,
|
|
111
|
-
unreadCount: 0,
|
|
112
|
-
createdAt: new Date(),
|
|
113
|
-
updatedAt: new Date(),
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
await db.discussions.update(discussionId, {
|
|
117
|
-
status: DiscussionStatus.BROKEN,
|
|
118
|
-
updatedAt: new Date(),
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
const discussion = await db.discussions.get(discussionId);
|
|
122
|
-
expect(discussion?.status).toBe(DiscussionStatus.BROKEN);
|
|
123
|
-
});
|
|
124
|
-
});
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
describe('Announcement Storage for Retry', () => {
|
|
128
|
-
beforeEach(async () => {
|
|
129
|
-
if (!db.isOpen()) {
|
|
130
|
-
await db.open();
|
|
131
|
-
}
|
|
132
|
-
await db.discussions.clear();
|
|
133
|
-
await db.pendingAnnouncements.clear();
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
it('should persist announcement bytes for retry on SEND_FAILED', async () => {
|
|
137
|
-
const announcement = new Uint8Array([1, 2, 3, 4, 5]);
|
|
138
|
-
const discussionId = await db.discussions.add({
|
|
139
|
-
ownerUserId: TEST_OWNER_USER_ID,
|
|
140
|
-
contactUserId: TEST_CONTACT_USER_ID,
|
|
141
|
-
direction: DiscussionDirection.INITIATED,
|
|
142
|
-
status: DiscussionStatus.SEND_FAILED,
|
|
143
|
-
initiationAnnouncement: announcement,
|
|
144
|
-
unreadCount: 0,
|
|
145
|
-
createdAt: new Date(),
|
|
146
|
-
updatedAt: new Date(),
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
const discussion = await db.discussions.get(discussionId);
|
|
150
|
-
expect(discussion?.initiationAnnouncement).toBeDefined();
|
|
151
|
-
expect(discussion?.initiationAnnouncement?.length).toBe(5);
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
it('should find discussions needing retry', async () => {
|
|
155
|
-
const announcement = new Uint8Array([10, 20, 30]);
|
|
156
|
-
await db.discussions.add({
|
|
157
|
-
ownerUserId: TEST_OWNER_USER_ID,
|
|
158
|
-
contactUserId: TEST_CONTACT_USER_ID,
|
|
159
|
-
direction: DiscussionDirection.INITIATED,
|
|
160
|
-
status: DiscussionStatus.SEND_FAILED,
|
|
161
|
-
initiationAnnouncement: announcement,
|
|
162
|
-
unreadCount: 0,
|
|
163
|
-
createdAt: new Date(),
|
|
164
|
-
updatedAt: new Date(),
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
const failedDiscussions = await db.discussions
|
|
168
|
-
.where('status')
|
|
169
|
-
.equals(DiscussionStatus.SEND_FAILED)
|
|
170
|
-
.filter(d => d.initiationAnnouncement !== undefined)
|
|
171
|
-
.toArray();
|
|
172
|
-
|
|
173
|
-
expect(failedDiscussions.length).toBe(1);
|
|
174
|
-
expect(failedDiscussions[0].initiationAnnouncement).toBeDefined();
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
it('should clear initiationAnnouncement when marked BROKEN', async () => {
|
|
178
|
-
const discussionId = await db.discussions.add({
|
|
179
|
-
ownerUserId: TEST_OWNER_USER_ID,
|
|
180
|
-
contactUserId: TEST_CONTACT_USER_ID,
|
|
181
|
-
direction: DiscussionDirection.INITIATED,
|
|
182
|
-
status: DiscussionStatus.SEND_FAILED,
|
|
183
|
-
initiationAnnouncement: new Uint8Array([1, 2, 3]),
|
|
184
|
-
unreadCount: 0,
|
|
185
|
-
createdAt: new Date(),
|
|
186
|
-
updatedAt: new Date(),
|
|
187
|
-
});
|
|
188
|
-
|
|
189
|
-
await db.discussions.update(discussionId, {
|
|
190
|
-
status: DiscussionStatus.BROKEN,
|
|
191
|
-
initiationAnnouncement: undefined,
|
|
192
|
-
updatedAt: new Date(),
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
const discussion = await db.discussions.get(discussionId);
|
|
196
|
-
expect(discussion?.status).toBe(DiscussionStatus.BROKEN);
|
|
197
|
-
expect(discussion?.initiationAnnouncement).toBeUndefined();
|
|
198
|
-
});
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
describe('Message Status Transitions', () => {
|
|
202
|
-
beforeEach(async () => {
|
|
203
|
-
if (!db.isOpen()) {
|
|
204
|
-
await db.open();
|
|
205
|
-
}
|
|
206
|
-
await db.messages.clear();
|
|
207
|
-
});
|
|
208
|
-
|
|
209
|
-
it('should transition SENDING -> SENT on successful send', async () => {
|
|
210
|
-
const messageId = await db.messages.add({
|
|
211
|
-
ownerUserId: TEST_OWNER_USER_ID,
|
|
212
|
-
contactUserId: TEST_CONTACT_USER_ID,
|
|
213
|
-
content: 'Test message',
|
|
214
|
-
type: MessageType.TEXT,
|
|
215
|
-
direction: MessageDirection.OUTGOING,
|
|
216
|
-
status: MessageStatus.SENDING,
|
|
217
|
-
timestamp: new Date(),
|
|
218
|
-
});
|
|
219
|
-
|
|
220
|
-
await db.messages.update(messageId, {
|
|
221
|
-
status: MessageStatus.SENT,
|
|
222
|
-
});
|
|
223
|
-
|
|
224
|
-
const message = await db.messages.get(messageId);
|
|
225
|
-
expect(message?.status).toBe(MessageStatus.SENT);
|
|
226
|
-
});
|
|
227
|
-
|
|
228
|
-
it('should transition SENDING -> FAILED on send failure', async () => {
|
|
229
|
-
const messageId = await db.messages.add({
|
|
230
|
-
ownerUserId: TEST_OWNER_USER_ID,
|
|
231
|
-
contactUserId: TEST_CONTACT_USER_ID,
|
|
232
|
-
content: 'Test message',
|
|
233
|
-
type: MessageType.TEXT,
|
|
234
|
-
direction: MessageDirection.OUTGOING,
|
|
235
|
-
status: MessageStatus.SENDING,
|
|
236
|
-
timestamp: new Date(),
|
|
237
|
-
});
|
|
238
|
-
|
|
239
|
-
await db.messages.update(messageId, {
|
|
240
|
-
status: MessageStatus.FAILED,
|
|
241
|
-
});
|
|
242
|
-
|
|
243
|
-
const message = await db.messages.get(messageId);
|
|
244
|
-
expect(message?.status).toBe(MessageStatus.FAILED);
|
|
245
|
-
});
|
|
246
|
-
|
|
247
|
-
it('should transition SENT -> DELIVERED on acknowledgment', async () => {
|
|
248
|
-
const messageId = await db.messages.add({
|
|
249
|
-
ownerUserId: TEST_OWNER_USER_ID,
|
|
250
|
-
contactUserId: TEST_CONTACT_USER_ID,
|
|
251
|
-
content: 'Test message',
|
|
252
|
-
type: MessageType.TEXT,
|
|
253
|
-
direction: MessageDirection.OUTGOING,
|
|
254
|
-
status: MessageStatus.SENT,
|
|
255
|
-
timestamp: new Date(),
|
|
256
|
-
});
|
|
257
|
-
|
|
258
|
-
await db.messages.update(messageId, {
|
|
259
|
-
status: MessageStatus.DELIVERED,
|
|
260
|
-
});
|
|
261
|
-
|
|
262
|
-
const message = await db.messages.get(messageId);
|
|
263
|
-
expect(message?.status).toBe(MessageStatus.DELIVERED);
|
|
264
|
-
});
|
|
265
|
-
});
|
|
266
|
-
|
|
267
|
-
describe('Discussion Stability Detection', () => {
|
|
268
|
-
beforeEach(async () => {
|
|
269
|
-
if (!db.isOpen()) {
|
|
270
|
-
await db.open();
|
|
271
|
-
}
|
|
272
|
-
await db.discussions.clear();
|
|
273
|
-
await db.messages.clear();
|
|
274
|
-
});
|
|
275
|
-
|
|
276
|
-
it('should detect unstable state when FAILED messages exist without encryptedMessage', async () => {
|
|
277
|
-
await db.discussions.add({
|
|
278
|
-
ownerUserId: TEST_OWNER_USER_ID,
|
|
279
|
-
contactUserId: TEST_CONTACT_USER_ID,
|
|
280
|
-
direction: DiscussionDirection.INITIATED,
|
|
281
|
-
status: DiscussionStatus.ACTIVE,
|
|
282
|
-
unreadCount: 0,
|
|
283
|
-
createdAt: new Date(),
|
|
284
|
-
updatedAt: new Date(),
|
|
285
|
-
});
|
|
286
|
-
|
|
287
|
-
await db.messages.add({
|
|
288
|
-
ownerUserId: TEST_OWNER_USER_ID,
|
|
289
|
-
contactUserId: TEST_CONTACT_USER_ID,
|
|
290
|
-
content: 'Test message',
|
|
291
|
-
type: MessageType.TEXT,
|
|
292
|
-
direction: MessageDirection.OUTGOING,
|
|
293
|
-
status: MessageStatus.FAILED,
|
|
294
|
-
timestamp: new Date(),
|
|
295
|
-
});
|
|
296
|
-
|
|
297
|
-
const messages = await db.messages
|
|
298
|
-
.where('[ownerUserId+contactUserId+direction]')
|
|
299
|
-
.equals([
|
|
300
|
-
TEST_OWNER_USER_ID,
|
|
301
|
-
TEST_CONTACT_USER_ID,
|
|
302
|
-
MessageDirection.OUTGOING,
|
|
303
|
-
])
|
|
304
|
-
.sortBy('id');
|
|
305
|
-
|
|
306
|
-
const lastMessage = messages[messages.length - 1];
|
|
307
|
-
const isUnstable =
|
|
308
|
-
lastMessage?.status === MessageStatus.FAILED &&
|
|
309
|
-
!lastMessage?.encryptedMessage;
|
|
310
|
-
|
|
311
|
-
expect(isUnstable).toBe(true);
|
|
312
|
-
});
|
|
313
|
-
|
|
314
|
-
it('should detect stable state when failed messages have encryptedMessage', async () => {
|
|
315
|
-
await db.discussions.add({
|
|
316
|
-
ownerUserId: TEST_OWNER_USER_ID,
|
|
317
|
-
contactUserId: TEST_CONTACT_USER_ID,
|
|
318
|
-
direction: DiscussionDirection.INITIATED,
|
|
319
|
-
status: DiscussionStatus.ACTIVE,
|
|
320
|
-
unreadCount: 0,
|
|
321
|
-
createdAt: new Date(),
|
|
322
|
-
updatedAt: new Date(),
|
|
323
|
-
});
|
|
324
|
-
|
|
325
|
-
await db.messages.add({
|
|
326
|
-
ownerUserId: TEST_OWNER_USER_ID,
|
|
327
|
-
contactUserId: TEST_CONTACT_USER_ID,
|
|
328
|
-
content: 'Test message',
|
|
329
|
-
type: MessageType.TEXT,
|
|
330
|
-
direction: MessageDirection.OUTGOING,
|
|
331
|
-
status: MessageStatus.FAILED,
|
|
332
|
-
encryptedMessage: new Uint8Array([1, 2, 3]),
|
|
333
|
-
timestamp: new Date(),
|
|
334
|
-
});
|
|
335
|
-
|
|
336
|
-
const messages = await db.messages
|
|
337
|
-
.where('[ownerUserId+contactUserId+direction]')
|
|
338
|
-
.equals([
|
|
339
|
-
TEST_OWNER_USER_ID,
|
|
340
|
-
TEST_CONTACT_USER_ID,
|
|
341
|
-
MessageDirection.OUTGOING,
|
|
342
|
-
])
|
|
343
|
-
.sortBy('id');
|
|
344
|
-
|
|
345
|
-
const lastMessage = messages[messages.length - 1];
|
|
346
|
-
const isUnstable =
|
|
347
|
-
lastMessage?.status === MessageStatus.FAILED &&
|
|
348
|
-
!lastMessage?.encryptedMessage;
|
|
349
|
-
|
|
350
|
-
expect(isUnstable).toBe(false);
|
|
351
|
-
});
|
|
352
|
-
|
|
353
|
-
it('should identify BROKEN discussion status', async () => {
|
|
354
|
-
await db.discussions.add({
|
|
355
|
-
ownerUserId: TEST_OWNER_USER_ID,
|
|
356
|
-
contactUserId: TEST_CONTACT_USER_ID,
|
|
357
|
-
direction: DiscussionDirection.INITIATED,
|
|
358
|
-
status: DiscussionStatus.BROKEN,
|
|
359
|
-
unreadCount: 0,
|
|
360
|
-
createdAt: new Date(),
|
|
361
|
-
updatedAt: new Date(),
|
|
362
|
-
});
|
|
363
|
-
|
|
364
|
-
const discussion = await db.getDiscussionByOwnerAndContact(
|
|
365
|
-
TEST_OWNER_USER_ID,
|
|
366
|
-
TEST_CONTACT_USER_ID
|
|
367
|
-
);
|
|
368
|
-
expect(discussion?.status).toBe(DiscussionStatus.BROKEN);
|
|
369
|
-
});
|
|
370
|
-
});
|
|
371
|
-
|
|
372
|
-
describe('Pending Announcements', () => {
|
|
373
|
-
beforeEach(async () => {
|
|
374
|
-
if (!db.isOpen()) {
|
|
375
|
-
await db.open();
|
|
376
|
-
}
|
|
377
|
-
await db.pendingAnnouncements.clear();
|
|
378
|
-
});
|
|
379
|
-
|
|
380
|
-
it('should store pending announcements for later processing', async () => {
|
|
381
|
-
const announcement = new Uint8Array([1, 2, 3, 4, 5]);
|
|
382
|
-
const counter = '12345';
|
|
383
|
-
|
|
384
|
-
await db.pendingAnnouncements.add({
|
|
385
|
-
announcement,
|
|
386
|
-
counter,
|
|
387
|
-
fetchedAt: new Date(),
|
|
388
|
-
});
|
|
389
|
-
|
|
390
|
-
const pending = await db.pendingAnnouncements.toArray();
|
|
391
|
-
expect(pending.length).toBe(1);
|
|
392
|
-
expect(pending[0].counter).toBe(counter);
|
|
393
|
-
});
|
|
394
|
-
|
|
395
|
-
it('should support partial deletion of processed announcements', async () => {
|
|
396
|
-
await db.pendingAnnouncements.add({
|
|
397
|
-
announcement: new Uint8Array([1]),
|
|
398
|
-
counter: '1',
|
|
399
|
-
fetchedAt: new Date(),
|
|
400
|
-
});
|
|
401
|
-
|
|
402
|
-
await db.pendingAnnouncements.add({
|
|
403
|
-
announcement: new Uint8Array([2]),
|
|
404
|
-
counter: '2',
|
|
405
|
-
fetchedAt: new Date(),
|
|
406
|
-
});
|
|
407
|
-
|
|
408
|
-
await db.pendingAnnouncements.add({
|
|
409
|
-
announcement: new Uint8Array([3]),
|
|
410
|
-
counter: '3',
|
|
411
|
-
fetchedAt: new Date(),
|
|
412
|
-
});
|
|
413
|
-
|
|
414
|
-
const pending = await db.pendingAnnouncements.toArray();
|
|
415
|
-
const idsToDelete = pending.slice(0, 2).map(p => p.id!);
|
|
416
|
-
await db.pendingAnnouncements.bulkDelete(idsToDelete);
|
|
417
|
-
|
|
418
|
-
const remaining = await db.pendingAnnouncements.toArray();
|
|
419
|
-
expect(remaining.length).toBe(1);
|
|
420
|
-
expect(remaining[0].counter).toBe('3');
|
|
421
|
-
});
|
|
422
|
-
});
|
|
423
|
-
|
|
424
|
-
describe('Contact Deletion Cleanup', () => {
|
|
425
|
-
beforeEach(async () => {
|
|
426
|
-
if (!db.isOpen()) {
|
|
427
|
-
await db.open();
|
|
428
|
-
}
|
|
429
|
-
await db.contacts.clear();
|
|
430
|
-
await db.discussions.clear();
|
|
431
|
-
await db.messages.clear();
|
|
432
|
-
});
|
|
433
|
-
|
|
434
|
-
it('should delete associated discussions when contact is deleted', async () => {
|
|
435
|
-
await db.contacts.add({
|
|
436
|
-
ownerUserId: TEST_OWNER_USER_ID,
|
|
437
|
-
userId: TEST_CONTACT_USER_ID,
|
|
438
|
-
name: 'Test Contact',
|
|
439
|
-
publicKeys: new Uint8Array([1, 2, 3]),
|
|
440
|
-
isOnline: false,
|
|
441
|
-
lastSeen: new Date(),
|
|
442
|
-
createdAt: new Date(),
|
|
443
|
-
});
|
|
444
|
-
|
|
445
|
-
await db.discussions.add({
|
|
446
|
-
ownerUserId: TEST_OWNER_USER_ID,
|
|
447
|
-
contactUserId: TEST_CONTACT_USER_ID,
|
|
448
|
-
direction: DiscussionDirection.INITIATED,
|
|
449
|
-
status: DiscussionStatus.ACTIVE,
|
|
450
|
-
unreadCount: 0,
|
|
451
|
-
createdAt: new Date(),
|
|
452
|
-
updatedAt: new Date(),
|
|
453
|
-
});
|
|
454
|
-
|
|
455
|
-
let discussion = await db.getDiscussionByOwnerAndContact(
|
|
456
|
-
TEST_OWNER_USER_ID,
|
|
457
|
-
TEST_CONTACT_USER_ID
|
|
458
|
-
);
|
|
459
|
-
expect(discussion).toBeDefined();
|
|
460
|
-
|
|
461
|
-
await db.transaction(
|
|
462
|
-
'rw',
|
|
463
|
-
[db.contacts, db.discussions, db.messages],
|
|
464
|
-
async () => {
|
|
465
|
-
await db.contacts
|
|
466
|
-
.where('[ownerUserId+userId]')
|
|
467
|
-
.equals([TEST_OWNER_USER_ID, TEST_CONTACT_USER_ID])
|
|
468
|
-
.delete();
|
|
469
|
-
|
|
470
|
-
await db.discussions
|
|
471
|
-
.where('[ownerUserId+contactUserId]')
|
|
472
|
-
.equals([TEST_OWNER_USER_ID, TEST_CONTACT_USER_ID])
|
|
473
|
-
.delete();
|
|
474
|
-
}
|
|
475
|
-
);
|
|
476
|
-
|
|
477
|
-
const contact = await db.getContactByOwnerAndUserId(
|
|
478
|
-
TEST_OWNER_USER_ID,
|
|
479
|
-
TEST_CONTACT_USER_ID
|
|
480
|
-
);
|
|
481
|
-
discussion = await db.getDiscussionByOwnerAndContact(
|
|
482
|
-
TEST_OWNER_USER_ID,
|
|
483
|
-
TEST_CONTACT_USER_ID
|
|
484
|
-
);
|
|
485
|
-
|
|
486
|
-
expect(contact).toBeUndefined();
|
|
487
|
-
expect(discussion).toBeUndefined();
|
|
488
|
-
});
|
|
489
|
-
|
|
490
|
-
it('should delete associated messages when contact is deleted', async () => {
|
|
491
|
-
await db.contacts.add({
|
|
492
|
-
ownerUserId: TEST_OWNER_USER_ID,
|
|
493
|
-
userId: TEST_CONTACT_USER_ID,
|
|
494
|
-
name: 'Test Contact',
|
|
495
|
-
publicKeys: new Uint8Array([1, 2, 3]),
|
|
496
|
-
isOnline: false,
|
|
497
|
-
lastSeen: new Date(),
|
|
498
|
-
createdAt: new Date(),
|
|
499
|
-
});
|
|
500
|
-
|
|
501
|
-
await db.messages.add({
|
|
502
|
-
ownerUserId: TEST_OWNER_USER_ID,
|
|
503
|
-
contactUserId: TEST_CONTACT_USER_ID,
|
|
504
|
-
content: 'Test message',
|
|
505
|
-
type: MessageType.TEXT,
|
|
506
|
-
direction: MessageDirection.OUTGOING,
|
|
507
|
-
status: MessageStatus.SENT,
|
|
508
|
-
timestamp: new Date(),
|
|
509
|
-
});
|
|
510
|
-
|
|
511
|
-
let messages = await db.messages
|
|
512
|
-
.where('[ownerUserId+contactUserId]')
|
|
513
|
-
.equals([TEST_OWNER_USER_ID, TEST_CONTACT_USER_ID])
|
|
514
|
-
.toArray();
|
|
515
|
-
expect(messages.length).toBe(1);
|
|
516
|
-
|
|
517
|
-
await db.transaction('rw', [db.contacts, db.messages], async () => {
|
|
518
|
-
await db.contacts
|
|
519
|
-
.where('[ownerUserId+userId]')
|
|
520
|
-
.equals([TEST_OWNER_USER_ID, TEST_CONTACT_USER_ID])
|
|
521
|
-
.delete();
|
|
522
|
-
|
|
523
|
-
await db.messages
|
|
524
|
-
.where('[ownerUserId+contactUserId]')
|
|
525
|
-
.equals([TEST_OWNER_USER_ID, TEST_CONTACT_USER_ID])
|
|
526
|
-
.delete();
|
|
527
|
-
});
|
|
528
|
-
|
|
529
|
-
messages = await db.messages
|
|
530
|
-
.where('[ownerUserId+contactUserId]')
|
|
531
|
-
.equals([TEST_OWNER_USER_ID, TEST_CONTACT_USER_ID])
|
|
532
|
-
.toArray();
|
|
533
|
-
expect(messages.length).toBe(0);
|
|
534
|
-
});
|
|
535
|
-
});
|