@antzsoft/chat-core 1.1.3 → 1.1.5

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.
@@ -0,0 +1,624 @@
1
+ type FileType = 'image' | 'video' | 'audio' | 'document';
2
+ type ConversationType = 'direct' | 'group';
3
+ type MessageStatus = 'sent' | 'delivered' | 'read' | 'failed' | 'deleted';
4
+ type DeliveryStatus = 'sending' | 'sent' | 'delivered' | 'read' | 'failed';
5
+ type UserStatus = 'online' | 'offline' | 'away';
6
+ type ParticipantRole = 'admin' | 'member';
7
+ /**
8
+ * Platform-agnostic file descriptor.
9
+ * - Web: built from a browser File object ({ uri: URL.createObjectURL(f), name: f.name, type: f.type, size: f.size })
10
+ * - React Native: built from document/image picker result ({ uri: result.uri, name: result.name, type: result.mimeType, size: result.size })
11
+ */
12
+ interface UploadableFile {
13
+ /** Local URI — blob URL on web, file:// URI on RN */
14
+ uri: string;
15
+ name: string;
16
+ /** MIME type, e.g. "image/jpeg" */
17
+ type: string;
18
+ size: number;
19
+ }
20
+ interface User {
21
+ id: string;
22
+ externalId?: string;
23
+ tenantId: string;
24
+ email: string;
25
+ username: string;
26
+ firstName?: string;
27
+ lastName?: string;
28
+ displayName: string;
29
+ avatarUrl?: string;
30
+ phone?: string;
31
+ status: UserStatus;
32
+ lastSeenAt?: string;
33
+ createdAt: string;
34
+ updatedAt: string;
35
+ }
36
+ interface AuthTokens {
37
+ accessToken: string;
38
+ refreshToken: string;
39
+ tokenType: string;
40
+ expiresIn: number;
41
+ }
42
+ interface AuthResponse {
43
+ user: User;
44
+ tokens: AuthTokens;
45
+ }
46
+ interface LoginCredentials {
47
+ email: string;
48
+ password: string;
49
+ }
50
+ interface RegisterData {
51
+ email: string;
52
+ password: string;
53
+ username: string;
54
+ firstName: string;
55
+ lastName: string;
56
+ displayName?: string;
57
+ phone?: string;
58
+ tenantId?: string;
59
+ }
60
+ interface Attachment {
61
+ id: string;
62
+ slotId?: string;
63
+ type: FileType;
64
+ url: string;
65
+ thumbnailUrl?: string;
66
+ filename: string;
67
+ mimeType: string;
68
+ size: number;
69
+ dimensions?: {
70
+ width: number;
71
+ height: number;
72
+ };
73
+ duration?: number;
74
+ isUploading?: boolean;
75
+ uploadProgress?: number;
76
+ }
77
+ interface MessageReaction {
78
+ emoji: string;
79
+ userIds: string[];
80
+ count: number;
81
+ }
82
+ interface MessageContent {
83
+ text?: string;
84
+ type: 'text' | 'attachment' | 'system';
85
+ attachments?: Attachment[];
86
+ }
87
+ interface ReplyAttachmentSnapshot {
88
+ type: FileType;
89
+ filename: string;
90
+ mimeType: string;
91
+ size: number;
92
+ duration?: number;
93
+ dimensions?: {
94
+ width: number;
95
+ height: number;
96
+ };
97
+ url: string;
98
+ }
99
+ interface MessageReplyReference {
100
+ messageId?: string;
101
+ contentPreview?: string;
102
+ senderName?: string;
103
+ attachmentSnapshot?: ReplyAttachmentSnapshot;
104
+ id?: string;
105
+ content?: MessageContent;
106
+ sender?: Pick<User, 'displayName' | 'avatarUrl'>;
107
+ }
108
+ interface Message {
109
+ id: string;
110
+ tenantId: string;
111
+ conversationId: string;
112
+ senderId: string;
113
+ content: MessageContent;
114
+ replyTo?: MessageReplyReference;
115
+ reactions: MessageReaction[];
116
+ status: MessageStatus;
117
+ deliveryStatus?: DeliveryStatus;
118
+ isEdited: boolean;
119
+ editedAt?: string;
120
+ isStarred?: boolean;
121
+ isPinned?: boolean;
122
+ pinnedBy?: string;
123
+ pinnedAt?: string;
124
+ uploadProgress?: number;
125
+ sentAt: string;
126
+ createdAt: string;
127
+ sender?: User;
128
+ senderName?: string;
129
+ readBy?: Array<{
130
+ userId: string;
131
+ readAt: string;
132
+ }>;
133
+ deliveredTo?: Array<{
134
+ userId: string;
135
+ deliveredAt: string;
136
+ }>;
137
+ }
138
+ interface Participant {
139
+ userId: string;
140
+ role: ParticipantRole;
141
+ joinedAt: string;
142
+ isActive?: boolean;
143
+ user?: User;
144
+ }
145
+ interface MessageConfig {
146
+ editWindowSeconds?: number;
147
+ deleteWindowSeconds?: number;
148
+ }
149
+ interface ConversationSettings {
150
+ onlyAdminsCanMessage?: boolean;
151
+ onlyAdminsCanAddMembers?: boolean;
152
+ messageConfig?: MessageConfig;
153
+ }
154
+ interface Conversation {
155
+ id: string;
156
+ tenantId: string;
157
+ conversationType: ConversationType;
158
+ name?: string;
159
+ description?: string;
160
+ iconUrl?: string;
161
+ participants: Participant[];
162
+ participantCount?: number;
163
+ settings?: ConversationSettings;
164
+ lastMessage?: Message;
165
+ createdBy?: string;
166
+ isActive: boolean;
167
+ createdAt: string;
168
+ updatedAt: string;
169
+ unreadCount?: number;
170
+ isPinned?: boolean;
171
+ isMuted?: boolean;
172
+ mutedUntil?: string;
173
+ }
174
+ interface AppConfig {
175
+ maxPinnedConversations: number;
176
+ }
177
+ interface ConversationUnreadCount {
178
+ conversationId: string;
179
+ unreadCount: number;
180
+ }
181
+ interface UnreadSummary {
182
+ /** Total unread messages across all conversations */
183
+ totalUnread: number;
184
+ /** Per-conversation breakdown — only includes conversations with unread > 0 */
185
+ byConversation: ConversationUnreadCount[];
186
+ }
187
+ interface ConversationListParams {
188
+ page?: number;
189
+ limit?: number;
190
+ /** Filter by conversation type */
191
+ type?: ConversationType;
192
+ /** Only pinned (true) or unpinned (false) conversations */
193
+ isPinned?: boolean;
194
+ /** Only muted (true) or unmuted (false) conversations */
195
+ isMuted?: boolean;
196
+ /** Only conversations with unread messages */
197
+ hasUnread?: boolean;
198
+ /** Search by group name / description (text index) */
199
+ search?: string;
200
+ /** Filter by current user's role in the conversation */
201
+ role?: ParticipantRole;
202
+ /** Filter by whether the last message has attachments */
203
+ hasAttachments?: boolean;
204
+ /** Filter by last message attachment type */
205
+ attachmentType?: FileType;
206
+ /** Filter by notification setting */
207
+ notificationsEnabled?: boolean;
208
+ }
209
+ interface PaginationMeta {
210
+ total: number;
211
+ page: number;
212
+ limit: number;
213
+ totalPages: number;
214
+ hasNextPage: boolean;
215
+ hasPrevPage: boolean;
216
+ }
217
+ interface PaginatedResponse<T> {
218
+ data: T[];
219
+ meta: PaginationMeta;
220
+ }
221
+ interface CursorPaginationMeta {
222
+ hasMore: boolean;
223
+ nextCursor?: string;
224
+ prevCursor?: string;
225
+ }
226
+ interface CursorPaginatedResponse<T> {
227
+ data: T[];
228
+ meta: CursorPaginationMeta;
229
+ }
230
+ type CompressionAlgorithm = 'webp' | 'jpeg' | 'gzip' | 'none';
231
+ interface CompressedFile extends UploadableFile {
232
+ originalSize: number;
233
+ compressed: boolean;
234
+ compressionAlgorithm: CompressionAlgorithm;
235
+ }
236
+ interface PresignedUrlRequest {
237
+ filename: string;
238
+ mimeType: string;
239
+ size: number;
240
+ conversationId?: string;
241
+ folder?: string;
242
+ metadata?: Record<string, unknown>;
243
+ }
244
+ interface PresignedUrlResponse {
245
+ fileId: string;
246
+ uploadUrl: string;
247
+ method: 'PUT' | 'POST';
248
+ headers: Record<string, string>;
249
+ fields?: Record<string, string>;
250
+ expiresAt: string;
251
+ maxSize: number;
252
+ allowedMimeType: string;
253
+ }
254
+ interface FileResponse {
255
+ id: string;
256
+ filename: string;
257
+ originalFilename: string;
258
+ mimeType: string;
259
+ size: number;
260
+ url: string;
261
+ thumbnailUrl?: string;
262
+ type: FileType;
263
+ uploadedAt?: string;
264
+ confirmedAt?: string;
265
+ }
266
+ interface UploadProgress {
267
+ fileId: string;
268
+ filename: string;
269
+ progress: number;
270
+ status: 'pending' | 'uploading' | 'confirming' | 'done' | 'error';
271
+ error?: string;
272
+ }
273
+ interface BatchUploadResult {
274
+ successful: FileResponse[];
275
+ failed: Array<{
276
+ filename: string;
277
+ error: string;
278
+ }>;
279
+ }
280
+ interface NewMessageEvent {
281
+ tempId?: string;
282
+ senderName?: string;
283
+ senderAvatarUrl?: string;
284
+ message: Message;
285
+ }
286
+ interface MessageUpdatedEvent {
287
+ messageId: string;
288
+ conversationId: string;
289
+ text: string;
290
+ editedAt: string;
291
+ }
292
+ interface MessageDeletedEvent {
293
+ messageId: string;
294
+ conversationId: string;
295
+ }
296
+ interface MessageDeletedForMeEvent {
297
+ messageId: string;
298
+ conversationId: string;
299
+ }
300
+ interface ReactionUpdatedEvent {
301
+ messageId: string;
302
+ conversationId: string;
303
+ reactions: MessageReaction[];
304
+ }
305
+ interface TypingIndicatorEvent {
306
+ conversationId: string;
307
+ userId: string;
308
+ username: string;
309
+ displayName: string;
310
+ avatarUrl?: string;
311
+ isTyping: boolean;
312
+ }
313
+ interface UserStatusEvent {
314
+ userId: string;
315
+ status: UserStatus;
316
+ lastSeenAt?: string;
317
+ }
318
+ interface ReadReceiptEvent {
319
+ conversationId: string;
320
+ messageId: string;
321
+ userId: string;
322
+ readAt: string;
323
+ updatedMessageIds?: string[];
324
+ fullyReadMessageIds?: string[];
325
+ }
326
+ interface MessageAckEvent {
327
+ tempId: string;
328
+ messageId: string;
329
+ status: MessageStatus;
330
+ }
331
+ interface MessageDeliveredEvent {
332
+ messageId: string;
333
+ conversationId: string;
334
+ deliveredTo: Array<{
335
+ userId: string;
336
+ deliveredAt: Date;
337
+ }>;
338
+ }
339
+ interface MessagesDeliveredEvent {
340
+ conversationId: string;
341
+ messageIds: string[];
342
+ deliveredTo: string;
343
+ deliveredAt: string;
344
+ }
345
+ interface SendMessageAttachment {
346
+ fileId: string;
347
+ type: FileType;
348
+ url: string;
349
+ thumbnailUrl?: string;
350
+ filename: string;
351
+ mimeType: string;
352
+ size: number;
353
+ duration?: number;
354
+ }
355
+ interface OptimisticAttachment extends SendMessageAttachment {
356
+ id: string;
357
+ slotId?: string;
358
+ url: string;
359
+ thumbnailUrl?: string;
360
+ filename: string;
361
+ mimeType: string;
362
+ size: number;
363
+ isUploading?: boolean;
364
+ uploadProgress?: number;
365
+ }
366
+ interface SendMessagePayload {
367
+ conversationId: string;
368
+ text?: string;
369
+ attachments?: SendMessageAttachment[];
370
+ replyTo?: string;
371
+ tempId: string;
372
+ }
373
+ interface QuietHours {
374
+ enabled: boolean;
375
+ /** HH:MM — e.g. "22:00" */
376
+ start: string;
377
+ /** HH:MM — e.g. "08:00" */
378
+ end: string;
379
+ /** IANA timezone — e.g. "Asia/Kolkata" */
380
+ timezone: string;
381
+ }
382
+ /**
383
+ * User notification preferences stored in chat_user_prefs.
384
+ * All fields are optional on update — only send what changed.
385
+ * Any future preference field is added here and to the server schema;
386
+ * no new collections or API endpoints needed.
387
+ */
388
+ interface UserPreferences {
389
+ /** Master switch — false disables all push notifications */
390
+ notificationsEnabled?: boolean;
391
+ /** Play sound with notifications */
392
+ soundEnabled?: boolean;
393
+ /** Show message text in notification body (false = show "New message" only) */
394
+ messagePreview?: boolean;
395
+ /** Notify when @mentioned in a group */
396
+ notifyOnMention?: boolean;
397
+ /** Notify when someone reacts to your message */
398
+ notifyOnReaction?: boolean;
399
+ /** Notify when added to a group */
400
+ notifyOnGroupInvite?: boolean;
401
+ /** Quiet hours window — no push delivered during this period */
402
+ quietHours?: QuietHours;
403
+ }
404
+
405
+ interface FileSizeLimits {
406
+ image?: number;
407
+ video?: number;
408
+ audio?: number;
409
+ document?: number;
410
+ default?: number;
411
+ }
412
+ /**
413
+ * Platform-provided function that performs the actual binary upload to a presigned URL.
414
+ * - Web implementation: XMLHttpRequest with progress events
415
+ * - RN implementation: fetch with FormData or direct body
416
+ *
417
+ * The core calls this — it never does the upload itself.
418
+ */
419
+ type PlatformUploadFn = (presigned: PresignedUrlResponse, file: UploadableFile, onProgress?: (pct: number) => void) => Promise<void>;
420
+ /**
421
+ * Platform-provided persistent key-value storage for auth token persistence.
422
+ * - Web: localStorage adapter
423
+ * - RN: AsyncStorage adapter
424
+ */
425
+ interface PersistStorage {
426
+ getItem(key: string): string | null | Promise<string | null>;
427
+ setItem(key: string, value: string): void | Promise<void>;
428
+ removeItem(key: string): void | Promise<void>;
429
+ }
430
+ /**
431
+ * Platform-provided compression function. Optional — if omitted, files are uploaded as-is.
432
+ * - Web: uses canvas (images) + CompressionStream (text/docs) — both browser-native
433
+ * - RN: uses expo-image-manipulator (images) + pako (text/docs)
434
+ * - Node: uses sharp (images) + zlib (text/docs)
435
+ */
436
+ type PlatformCompressFn = (file: UploadableFile, options: ResolvedCompressionConfig) => Promise<CompressedFile>;
437
+ interface CompressionConfig {
438
+ /** Master switch. Default: true when platformCompressFn is provided, false otherwise */
439
+ enabled?: boolean;
440
+ /** WebP quality for images, 0–1. Default: 0.85 */
441
+ imageQuality?: number;
442
+ /** Longest side cap in px before encoding. Default: 1920 */
443
+ imageMaxDimension?: number;
444
+ /** Gzip text-based documents (plain, csv, json, xml, yaml, svg). Default: true */
445
+ compressDocuments?: boolean;
446
+ }
447
+ interface ResolvedCompressionConfig {
448
+ enabled: boolean;
449
+ imageQuality: number;
450
+ imageMaxDimension: number;
451
+ compressDocuments: boolean;
452
+ }
453
+ interface UploadConfig {
454
+ /**
455
+ * Per-type file size limits in MB. Can also pass a single number for all types.
456
+ * Defaults: image 5MB, video 25MB, audio 10MB, document 10MB.
457
+ */
458
+ maxFileSizeMB?: number | FileSizeLimits;
459
+ /** Max files per message. Default: 10 */
460
+ maxFilesPerMessage?: number;
461
+ /** Which attachment types users can send. Default: all */
462
+ allowedTypes?: Array<FileType>;
463
+ /** Called when a file fails validation or upload */
464
+ onUploadError?: (file: UploadableFile, error: Error) => void;
465
+ /** Called with 0–100 aggregate progress during a batch upload */
466
+ onProgress?: (progress: number) => void;
467
+ }
468
+ interface AntzChatConfig {
469
+ /** REST API base URL — e.g. "https://api.yourapp.com/api/v1" */
470
+ apiUrl: string;
471
+ /**
472
+ * WebSocket server URL. Defaults to apiUrl with /api/vN path stripped.
473
+ * SDK connects to {socketUrl}/chat
474
+ */
475
+ socketUrl?: string;
476
+ /** Static JWT. Use this OR authProvider, not both. */
477
+ authToken?: string;
478
+ /**
479
+ * Dynamic token getter — called before requests and on socket reconnect.
480
+ * Preferred when the host app manages its own auth lifecycle.
481
+ */
482
+ authProvider?: () => Promise<string>;
483
+ /**
484
+ * External user ID — required for non-builtin modes (antz / external / wso2).
485
+ * Sent as x-user-id header on every request so the chat server can forward it
486
+ * to the user-service for token validation.
487
+ * Not needed for builtin mode (chat server issues its own JWTs).
488
+ */
489
+ userId?: string;
490
+ /**
491
+ * Profile picture for non-builtin modes.
492
+ * Server fetches/decodes, hashes for dedup, uploads to chat storage on first use.
493
+ * Only sent once at init — not re-sent on every request.
494
+ * Client never needs to compute hashes; the server owns all dedup logic.
495
+ */
496
+ avatar?: {
497
+ /** Full URL the server can fetch (preferred — Antz/external/wso2 clients know their own file URLs) */
498
+ url?: string;
499
+ /** Raw base64 string (with or without data:... prefix) as fallback */
500
+ base64?: string;
501
+ };
502
+ /** Required for multi-tenant backends. Sent as X-Tenant-ID header. */
503
+ tenantId?: string;
504
+ /**
505
+ * Enable payload-level transit encryption (ECDH key exchange + AES-256-GCM).
506
+ * Encrypts every HTTP request/response body and every socket event payload.
507
+ * Server must have TRANSIT_ENCRYPTION_ENABLED=true to match.
508
+ * Default: true — set false only for local development/debugging.
509
+ * Safe to toggle anytime — no data migration needed (wire-only, never affects storage).
510
+ */
511
+ transitEncryption?: boolean;
512
+ upload?: UploadConfig;
513
+ /**
514
+ * Optional compression config. Compression is disabled if platformCompressFn is not provided.
515
+ */
516
+ compression?: CompressionConfig;
517
+ /**
518
+ * Platform-specific compression implementation. Optional — omit to disable compression.
519
+ * Each SDK (web, RN) provides its own default; Node.js users wire in their own.
520
+ */
521
+ platformCompressFn?: PlatformCompressFn;
522
+ /**
523
+ * Number of messages fetched per page when loading chat history.
524
+ * Default: 40
525
+ */
526
+ messagePageSize?: number;
527
+ /**
528
+ * Number of starred messages fetched per page.
529
+ * Default: 30
530
+ */
531
+ starredMessagePageSize?: number;
532
+ /**
533
+ * Number of search results fetched per request.
534
+ * Default: 50
535
+ */
536
+ searchPageSize?: number;
537
+ /**
538
+ * Platform-specific binary upload implementation.
539
+ * Required — each SDK (web, RN) provides its own.
540
+ */
541
+ platformUploadFn: PlatformUploadFn;
542
+ /**
543
+ * Platform-specific persistent storage for auth tokens.
544
+ * Required — each SDK provides its own (localStorage / AsyncStorage).
545
+ */
546
+ persistStorage: PersistStorage;
547
+ }
548
+ interface ResolvedFileSizeLimits {
549
+ image: number;
550
+ video: number;
551
+ audio: number;
552
+ document: number;
553
+ default: number;
554
+ }
555
+ interface ResolvedConfig {
556
+ apiUrl: string;
557
+ socketUrl: string;
558
+ socketOrigin: string;
559
+ socketPath: string;
560
+ authToken?: string;
561
+ authProvider?: () => Promise<string>;
562
+ userId?: string;
563
+ tenantId?: string;
564
+ avatar?: {
565
+ url?: string;
566
+ base64?: string;
567
+ };
568
+ transitEncryption: boolean;
569
+ upload: {
570
+ maxFileSizeMB: ResolvedFileSizeLimits;
571
+ maxFilesPerMessage: number;
572
+ allowedTypes: FileType[];
573
+ onUploadError?: (file: UploadableFile, error: Error) => void;
574
+ onProgress?: (progress: number) => void;
575
+ };
576
+ platformUploadFn: PlatformUploadFn;
577
+ platformCompressFn?: PlatformCompressFn;
578
+ compression: ResolvedCompressionConfig;
579
+ persistStorage: PersistStorage;
580
+ messagePageSize: number;
581
+ starredMessagePageSize: number;
582
+ searchPageSize: number;
583
+ }
584
+ declare function resolveConfig(config: AntzChatConfig): ResolvedConfig;
585
+
586
+ declare const storageApi: {
587
+ requestPresignedUrl(payload: PresignedUrlRequest): Promise<PresignedUrlResponse>;
588
+ requestPresignedUrlBatch(files: PresignedUrlRequest[]): Promise<{
589
+ urls: PresignedUrlResponse[];
590
+ errors: Array<{
591
+ filename: string;
592
+ error: string;
593
+ }>;
594
+ }>;
595
+ confirmUpload(fileId: string): Promise<FileResponse>;
596
+ getFile(fileId: string): Promise<FileResponse>;
597
+ getFileUrl(fileId: string, expiresIn?: number): Promise<{
598
+ url: string;
599
+ expiresAt: string;
600
+ }>;
601
+ deleteFile(fileId: string): Promise<void>;
602
+ getConversationFiles(conversationId: string, params?: {
603
+ page?: number;
604
+ limit?: number;
605
+ type?: FileType;
606
+ }): Promise<PaginatedResponse<FileResponse>>;
607
+ getMyFiles(params?: {
608
+ page?: number;
609
+ limit?: number;
610
+ }): Promise<PaginatedResponse<FileResponse>>;
611
+ };
612
+ /** Public API — returns standard BatchUploadResult, slot tracking is internal. */
613
+ declare function uploadBatch(files: UploadableFile[], platformUploadFn: PlatformUploadFn, conversationId?: string, onProgress?: (pct: number) => void, platformCompressFn?: PlatformCompressFn, compressionConfig?: ResolvedCompressionConfig): Promise<BatchUploadResult>;
614
+ /**
615
+ * Used only by useChat hooks (web + RN) to get the slotId → FileResponse map
616
+ * for matching confirmed uploads back to optimistic UI slots.
617
+ * Not exported from the package index — internal SDK use only.
618
+ */
619
+ declare function uploadBatchWithSlots(files: UploadableFile[], platformUploadFn: PlatformUploadFn, slotIds: string[], conversationId?: string, onProgress?: (pct: number) => void, platformCompressFn?: PlatformCompressFn, compressionConfig?: ResolvedCompressionConfig): Promise<{
620
+ result: BatchUploadResult;
621
+ slotToFile: Map<string, FileResponse>;
622
+ }>;
623
+
624
+ export { type UserStatusEvent as $, type AntzChatConfig as A, type BatchUploadResult as B, type CompressedFile as C, type PresignedUrlResponse as D, type ReadReceiptEvent as E, type FileResponse as F, type RegisterData as G, type ReplyAttachmentSnapshot as H, type ResolvedCompressionConfig as I, type ResolvedConfig as J, type ResolvedFileSizeLimits as K, type LoginCredentials as L, type Message as M, type NewMessageEvent as N, type OptimisticAttachment as O, type PaginatedResponse as P, type QuietHours as Q, type ReactionUpdatedEvent as R, type SendMessageAttachment as S, type SendMessagePayload as T, type TypingIndicatorEvent as U, type UnreadSummary as V, type UploadConfig as W, type UploadProgress as X, type UploadableFile as Y, type User as Z, type UserPreferences as _, type AppConfig as a, resolveConfig as a0, storageApi as a1, uploadBatch as a2, uploadBatchWithSlots as a3, type Attachment as b, type AuthResponse as c, type AuthTokens as d, type CompressionAlgorithm as e, type CompressionConfig as f, type Conversation as g, type ConversationListParams as h, type ConversationUnreadCount as i, type CursorPaginatedResponse as j, type FileSizeLimits as k, type FileType as l, type MessageAckEvent as m, type MessageContent as n, type MessageDeletedEvent as o, type MessageDeletedForMeEvent as p, type MessageDeliveredEvent as q, type MessageReaction as r, type MessageReplyReference as s, type MessageUpdatedEvent as t, type MessagesDeliveredEvent as u, type Participant as v, type PersistStorage as w, type PlatformCompressFn as x, type PlatformUploadFn as y, type PresignedUrlRequest as z };