@antzsoft/chat-core 1.0.5 → 1.0.7
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/README.md +31 -3
- package/dist/index.cjs +5 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +14 -4
- package/dist/index.d.ts +14 -4
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/docs/integration-guide.html +153 -23
- package/package.json +1 -1
|
@@ -132,7 +132,7 @@ li{margin-bottom:4px;color:#c8d0e0}
|
|
|
132
132
|
|
|
133
133
|
<div class="section-label">What's New</div>
|
|
134
134
|
<ul>
|
|
135
|
-
<li><a href="#whats-new">v1.0.
|
|
135
|
+
<li><a href="#whats-new">v1.0.7 Release Notes</a></li>
|
|
136
136
|
</ul>
|
|
137
137
|
|
|
138
138
|
<div class="section-label">Getting Started</div>
|
|
@@ -218,11 +218,11 @@ li{margin-bottom:4px;color:#c8d0e0}
|
|
|
218
218
|
<h2>What's New</h2>
|
|
219
219
|
<p style="color:var(--muted);font-size:13px;margin-bottom:20px">Version history and release notes. Click a version to expand.</p>
|
|
220
220
|
|
|
221
|
-
<!-- ── v1.0.
|
|
222
|
-
<div class="wn-version" id="wn-
|
|
223
|
-
<div class="wn-header" onclick="toggleVersion('wn-
|
|
221
|
+
<!-- ── v1.0.7 (current) ── -->
|
|
222
|
+
<div class="wn-version open" id="wn-107">
|
|
223
|
+
<div class="wn-header" onclick="toggleVersion('wn-107')">
|
|
224
224
|
<div class="wn-title">
|
|
225
|
-
<span class="wn-ver">v1.0.
|
|
225
|
+
<span class="wn-ver">v1.0.7</span>
|
|
226
226
|
<span class="wn-badge current">Current</span>
|
|
227
227
|
<span class="wn-date">May 2026</span>
|
|
228
228
|
</div>
|
|
@@ -230,8 +230,91 @@ li{margin-bottom:4px;color:#c8d0e0}
|
|
|
230
230
|
</div>
|
|
231
231
|
<div class="wn-body">
|
|
232
232
|
|
|
233
|
-
<div class="wn-item" id="wn-
|
|
234
|
-
<div class="wn-item-header" onclick="toggleItem('wn-
|
|
233
|
+
<div class="wn-item" id="wn-107-1">
|
|
234
|
+
<div class="wn-item-header" onclick="toggleItem('wn-107-1')">
|
|
235
|
+
<span class="wn-tag new">New</span>
|
|
236
|
+
<span class="wn-item-title"><code>deliveredTo</code> per-user delivery timestamps on all messages</span>
|
|
237
|
+
<span class="wn-chevron-sm">▾</span>
|
|
238
|
+
</div>
|
|
239
|
+
<div class="wn-item-body">
|
|
240
|
+
<p>All message responses (REST list, single fetch, send, edit, pin, star, search) now include a <code>deliveredTo</code> array alongside <code>readBy</code>, giving you per-user delivery timestamps for "message info" panels.</p>
|
|
241
|
+
<pre><code><span class="cm">// Message object — new fields</span>
|
|
242
|
+
{
|
|
243
|
+
<span class="at">readBy</span>: [{ <span class="at">userId</span>: <span class="str">'user_2'</span>, <span class="at">readAt</span>: <span class="str">'2026-05-18T10:00:00.000Z'</span> }],
|
|
244
|
+
<span class="at">deliveredTo</span>: [{ <span class="at">userId</span>: <span class="str">'user_2'</span>, <span class="at">deliveredAt</span>: <span class="str">'2026-05-18T09:59:00.000Z'</span> }],
|
|
245
|
+
}</code></pre>
|
|
246
|
+
<p>The <code>message_delivered</code> socket event payload has also changed — <code>deliveredTo</code> is now <code>Array<{ userId, deliveredAt }></code> (top-level <code>deliveredAt</code> removed).</p>
|
|
247
|
+
<p><strong>Breaking change:</strong> <code>Message.readBy</code> type changed from <code>string[]</code> to <code>Array<{ userId: string; readAt: string }></code>. Update any code reading <code>readBy</code> entries as plain strings.</p>
|
|
248
|
+
<p class="wn-ref">→ <a href="#step-realtime">Step 10 — Real-time Events</a> (<code>message_delivered</code> event)</p>
|
|
249
|
+
</div>
|
|
250
|
+
</div>
|
|
251
|
+
|
|
252
|
+
<div class="wn-item" id="wn-107-2">
|
|
253
|
+
<div class="wn-item-header" onclick="toggleItem('wn-107-2')">
|
|
254
|
+
<span class="wn-tag new">New</span>
|
|
255
|
+
<span class="wn-item-title">Audio attachment support for <code>.m4a</code> / <code>audio/x-m4a</code></span>
|
|
256
|
+
<span class="wn-chevron-sm">▾</span>
|
|
257
|
+
</div>
|
|
258
|
+
<div class="wn-item-body">
|
|
259
|
+
<p>The server now accepts <code>audio/m4a</code> and <code>audio/x-m4a</code> MIME types for audio attachments. Previously only <code>audio/mpeg</code>, <code>audio/ogg</code>, and <code>audio/wav</code> were accepted — uploads of <code>.m4a</code> files returned a <code>400</code> unsupported type error.</p>
|
|
260
|
+
<p><strong>Action required:</strong> No SDK change needed. If you were filtering <code>.m4a</code> files out in the client before upload, remove that restriction.</p>
|
|
261
|
+
</div>
|
|
262
|
+
</div>
|
|
263
|
+
|
|
264
|
+
<div class="wn-item" id="wn-107-3">
|
|
265
|
+
<div class="wn-item-header" onclick="toggleItem('wn-107-3')">
|
|
266
|
+
<span class="wn-tag new">New</span>
|
|
267
|
+
<span class="wn-item-title">Participant filter on <code>getMembers</code></span>
|
|
268
|
+
<span class="wn-chevron-sm">▾</span>
|
|
269
|
+
</div>
|
|
270
|
+
<div class="wn-item-body">
|
|
271
|
+
<p><code>getMembers</code> now accepts a <code>filter</code> parameter to control which participants are returned.</p>
|
|
272
|
+
<pre><code><span class="cm">// active only (default — same as before)</span>
|
|
273
|
+
<span class="kw">await</span> conversationsApi.<span class="fn">getMembers</span>(conversationId);
|
|
274
|
+
|
|
275
|
+
<span class="cm">// all participants including removed ones</span>
|
|
276
|
+
<span class="kw">await</span> conversationsApi.<span class="fn">getMembers</span>(conversationId, { <span class="at">filter</span>: <span class="str">'all'</span> });
|
|
277
|
+
|
|
278
|
+
<span class="cm">// only removed participants</span>
|
|
279
|
+
<span class="kw">await</span> conversationsApi.<span class="fn">getMembers</span>(conversationId, { <span class="at">filter</span>: <span class="str">'deleted'</span> });</code></pre>
|
|
280
|
+
<p>Default is <code>'active'</code> — no behaviour change for existing callers.</p>
|
|
281
|
+
<p class="wn-ref">→ <a href="#step-convs">Step 6 — Conversations</a> (participants section)</p>
|
|
282
|
+
</div>
|
|
283
|
+
</div>
|
|
284
|
+
|
|
285
|
+
<div class="wn-item" id="wn-107-4">
|
|
286
|
+
<div class="wn-item-header" onclick="toggleItem('wn-107-4')">
|
|
287
|
+
<span class="wn-tag new">New</span>
|
|
288
|
+
<span class="wn-item-title">Message character limit — 10,000</span>
|
|
289
|
+
<span class="wn-chevron-sm">▾</span>
|
|
290
|
+
</div>
|
|
291
|
+
<div class="wn-item-body">
|
|
292
|
+
<p>Text message content is now capped at <strong>10,000 characters</strong>. Sending a message that exceeds this limit returns a <code>400</code> validation error.</p>
|
|
293
|
+
<p><strong>Action required:</strong> Add client-side length validation before send to give users immediate feedback rather than waiting for a server error.</p>
|
|
294
|
+
<pre><code><span class="kw">const</span> MAX_LENGTH = <span class="num">10000</span>;
|
|
295
|
+
<span class="kw">if</span> (text.length > MAX_LENGTH) {
|
|
296
|
+
<span class="fn">showError</span>(<span class="str">`Message too long (${text.length}/${MAX_LENGTH})`</span>);
|
|
297
|
+
<span class="kw">return</span>;
|
|
298
|
+
}</code></pre>
|
|
299
|
+
</div>
|
|
300
|
+
</div>
|
|
301
|
+
|
|
302
|
+
</div><!-- /.wn-body -->
|
|
303
|
+
</div><!-- /.wn-version -->
|
|
304
|
+
|
|
305
|
+
<!-- ── v1.0.6 ── -->
|
|
306
|
+
<div class="wn-version" id="wn-106">
|
|
307
|
+
<div class="wn-header" onclick="toggleVersion('wn-106')">
|
|
308
|
+
<div class="wn-title">
|
|
309
|
+
<span class="wn-ver">v1.0.6</span>
|
|
310
|
+
<span class="wn-date">May 2026</span>
|
|
311
|
+
</div>
|
|
312
|
+
<span class="wn-chevron">▲</span>
|
|
313
|
+
</div>
|
|
314
|
+
<div class="wn-body">
|
|
315
|
+
|
|
316
|
+
<div class="wn-item" id="wn-106-1">
|
|
317
|
+
<div class="wn-item-header" onclick="toggleItem('wn-106-1')">
|
|
235
318
|
<span class="wn-tag new">New</span>
|
|
236
319
|
<span class="wn-item-title"><code>externalId</code> on all user responses</span>
|
|
237
320
|
<span class="wn-chevron-sm">▾</span>
|
|
@@ -243,8 +326,8 @@ li{margin-bottom:4px;color:#c8d0e0}
|
|
|
243
326
|
</div>
|
|
244
327
|
</div>
|
|
245
328
|
|
|
246
|
-
<div class="wn-item" id="wn-
|
|
247
|
-
<div class="wn-item-header" onclick="toggleItem('wn-
|
|
329
|
+
<div class="wn-item" id="wn-106-2">
|
|
330
|
+
<div class="wn-item-header" onclick="toggleItem('wn-106-2')">
|
|
248
331
|
<span class="wn-tag new">New</span>
|
|
249
332
|
<span class="wn-item-title">Single unified User List API</span>
|
|
250
333
|
<span class="wn-chevron-sm">▾</span>
|
|
@@ -258,8 +341,8 @@ li{margin-bottom:4px;color:#c8d0e0}
|
|
|
258
341
|
</div>
|
|
259
342
|
</div>
|
|
260
343
|
|
|
261
|
-
<div class="wn-item" id="wn-
|
|
262
|
-
<div class="wn-item-header" onclick="toggleItem('wn-
|
|
344
|
+
<div class="wn-item" id="wn-106-3">
|
|
345
|
+
<div class="wn-item-header" onclick="toggleItem('wn-106-3')">
|
|
263
346
|
<span class="wn-tag new">New</span>
|
|
264
347
|
<span class="wn-item-title">Single unified Conversation List API</span>
|
|
265
348
|
<span class="wn-chevron-sm">▾</span>
|
|
@@ -273,8 +356,8 @@ li{margin-bottom:4px;color:#c8d0e0}
|
|
|
273
356
|
</div>
|
|
274
357
|
</div>
|
|
275
358
|
|
|
276
|
-
<div class="wn-item" id="wn-
|
|
277
|
-
<div class="wn-item-header" onclick="toggleItem('wn-
|
|
359
|
+
<div class="wn-item" id="wn-106-4">
|
|
360
|
+
<div class="wn-item-header" onclick="toggleItem('wn-106-4')">
|
|
278
361
|
<span class="wn-tag fix">Fix</span>
|
|
279
362
|
<span class="wn-item-title">Attachment last-message content preview</span>
|
|
280
363
|
<span class="wn-chevron-sm">▾</span>
|
|
@@ -286,8 +369,8 @@ li{margin-bottom:4px;color:#c8d0e0}
|
|
|
286
369
|
</div>
|
|
287
370
|
</div>
|
|
288
371
|
|
|
289
|
-
<div class="wn-item" id="wn-
|
|
290
|
-
<div class="wn-item-header" onclick="toggleItem('wn-
|
|
372
|
+
<div class="wn-item" id="wn-106-5">
|
|
373
|
+
<div class="wn-item-header" onclick="toggleItem('wn-106-5')">
|
|
291
374
|
<span class="wn-tag fix">Fix</span>
|
|
292
375
|
<span class="wn-item-title">Avatar upload via <code>AntzChatClient</code></span>
|
|
293
376
|
<span class="wn-chevron-sm">▾</span>
|
|
@@ -299,8 +382,8 @@ li{margin-bottom:4px;color:#c8d0e0}
|
|
|
299
382
|
</div>
|
|
300
383
|
</div>
|
|
301
384
|
|
|
302
|
-
<div class="wn-item" id="wn-
|
|
303
|
-
<div class="wn-item-header" onclick="toggleItem('wn-
|
|
385
|
+
<div class="wn-item" id="wn-106-6">
|
|
386
|
+
<div class="wn-item-header" onclick="toggleItem('wn-106-6')">
|
|
304
387
|
<span class="wn-tag fix">Fix</span>
|
|
305
388
|
<span class="wn-item-title"><code>client.connect()</code> on React Native</span>
|
|
306
389
|
<span class="wn-chevron-sm">▾</span>
|
|
@@ -312,8 +395,8 @@ li{margin-bottom:4px;color:#c8d0e0}
|
|
|
312
395
|
</div>
|
|
313
396
|
</div>
|
|
314
397
|
|
|
315
|
-
<div class="wn-item" id="wn-
|
|
316
|
-
<div class="wn-item-header" onclick="toggleItem('wn-
|
|
398
|
+
<div class="wn-item" id="wn-106-7">
|
|
399
|
+
<div class="wn-item-header" onclick="toggleItem('wn-106-7')">
|
|
317
400
|
<span class="wn-tag new">New</span>
|
|
318
401
|
<span class="wn-item-title">Group icon — create & update</span>
|
|
319
402
|
<span class="wn-chevron-sm">▾</span>
|
|
@@ -330,8 +413,8 @@ li{margin-bottom:4px;color:#c8d0e0}
|
|
|
330
413
|
</div>
|
|
331
414
|
</div>
|
|
332
415
|
|
|
333
|
-
<div class="wn-item" id="wn-
|
|
334
|
-
<div class="wn-item-header" onclick="toggleItem('wn-
|
|
416
|
+
<div class="wn-item" id="wn-106-8">
|
|
417
|
+
<div class="wn-item-header" onclick="toggleItem('wn-106-8')">
|
|
335
418
|
<span class="wn-tag new">New</span>
|
|
336
419
|
<span class="wn-item-title">Scroll to first unread message</span>
|
|
337
420
|
<span class="wn-chevron-sm">▾</span>
|
|
@@ -356,6 +439,53 @@ li{margin-bottom:4px;color:#c8d0e0}
|
|
|
356
439
|
</div>
|
|
357
440
|
</div>
|
|
358
441
|
|
|
442
|
+
<div class="wn-item" id="wn-106-9">
|
|
443
|
+
<div class="wn-item-header" onclick="toggleItem('wn-106-9')">
|
|
444
|
+
<span class="wn-tag new">New</span>
|
|
445
|
+
<span class="wn-item-title">Push notifications — device token registration (RN & Web)</span>
|
|
446
|
+
<span class="wn-chevron-sm">▾</span>
|
|
447
|
+
</div>
|
|
448
|
+
<div class="wn-item-body">
|
|
449
|
+
<p>Push notification token registration is now fully documented and supported via <code>devicesApi.register()</code>. Both React Native (Expo and FCM) and Web (VAPID/Web Push) teams should register tokens immediately after login on every app launch.</p>
|
|
450
|
+
|
|
451
|
+
<h4>React Native — Expo</h4>
|
|
452
|
+
<pre><code><span class="kw">await</span> devicesApi.<span class="fn">register</span>({
|
|
453
|
+
deviceId, <span class="cm">// stable UUID — generate once, store in SecureStore, never regenerate</span>
|
|
454
|
+
platform: <span class="str">'ios'</span>, <span class="cm">// or 'android'</span>
|
|
455
|
+
provider: <span class="str">'expo'</span>,
|
|
456
|
+
token, <span class="cm">// from Notifications.getExpoPushTokenAsync()</span>
|
|
457
|
+
userAgent: <span class="str">`${Device.modelName} / ${Device.osName} ${Device.osVersion}`</span>,
|
|
458
|
+
});</code></pre>
|
|
459
|
+
|
|
460
|
+
<h4>React Native — FCM (Firebase)</h4>
|
|
461
|
+
<pre><code><span class="kw">await</span> devicesApi.<span class="fn">register</span>({
|
|
462
|
+
deviceId,
|
|
463
|
+
platform: <span class="str">'android'</span>, provider: <span class="str">'fcm'</span>,
|
|
464
|
+
token, <span class="cm">// from messaging().getToken()</span>
|
|
465
|
+
});
|
|
466
|
+
<span class="cm">// Re-register whenever Firebase rotates the token</span>
|
|
467
|
+
messaging().<span class="fn">onTokenRefresh</span>(<span class="kw">async</span> (t) => devicesApi.<span class="fn">register</span>({ deviceId, platform: <span class="str">'android'</span>, provider: <span class="str">'fcm'</span>, token: t }));</code></pre>
|
|
468
|
+
|
|
469
|
+
<h4>Web — VAPID / Web Push</h4>
|
|
470
|
+
<pre><code><span class="kw">await</span> devicesApi.<span class="fn">register</span>({
|
|
471
|
+
deviceId, <span class="cm">// stable UUID — store in localStorage, never regenerate</span>
|
|
472
|
+
platform: <span class="str">'web'</span>, provider: <span class="str">'web-push'</span>,
|
|
473
|
+
endpoint: sub.endpoint,
|
|
474
|
+
p256dh: <span class="fn">b64</span>(sub.<span class="fn">getKey</span>(<span class="str">'p256dh'</span>)),
|
|
475
|
+
auth: <span class="fn">b64</span>(sub.<span class="fn">getKey</span>(<span class="str">'auth'</span>)),
|
|
476
|
+
userAgent: navigator.userAgent,
|
|
477
|
+
});</code></pre>
|
|
478
|
+
|
|
479
|
+
<p><strong>Key rules for all platforms:</strong></p>
|
|
480
|
+
<ul style="margin:4px 0 8px 18px;font-size:13px;color:#c8d0e0;line-height:2">
|
|
481
|
+
<li>Call <code>register()</code> on <strong>every app launch after login</strong> — the call is an upsert, safe to repeat.</li>
|
|
482
|
+
<li>Call <code>devicesApi.remove(deviceId)</code> on logout to stop push immediately.</li>
|
|
483
|
+
<li>Never regenerate <code>deviceId</code> — if lost, the old token record becomes an orphan.</li>
|
|
484
|
+
</ul>
|
|
485
|
+
<p class="wn-ref">→ <a href="#step-push">Step 17 — Push Notifications</a> for complete code, token lifecycle tables, and service worker setup (web)</p>
|
|
486
|
+
</div>
|
|
487
|
+
</div>
|
|
488
|
+
|
|
359
489
|
</div><!-- /.wn-body -->
|
|
360
490
|
</div><!-- /.wn-version -->
|
|
361
491
|
|
|
@@ -1395,12 +1525,12 @@ socket.<span class="fn">on</span>(<span class="str">'message_deleted'</span>, (e
|
|
|
1395
1525
|
</tr>
|
|
1396
1526
|
<tr>
|
|
1397
1527
|
<td><code>'message_delivered'</code></td>
|
|
1398
|
-
<td>A single message you sent was delivered to all active recipients</td>
|
|
1528
|
+
<td>A single message you sent was delivered to all active recipients. Payload: <code>{ messageId, conversationId, deliveredTo: Array<{ userId, deliveredAt }> }</code></td>
|
|
1399
1529
|
<td><strong>Chat detail screen</strong> — add on mount, remove on unmount.</td>
|
|
1400
1530
|
</tr>
|
|
1401
1531
|
<tr>
|
|
1402
1532
|
<td><code>'messages_delivered'</code></td>
|
|
1403
|
-
<td>Batch delivery catch-up when a recipient comes online</td>
|
|
1533
|
+
<td>Batch delivery catch-up when a recipient comes online. Payload: <code>{ conversationId, messageIds[], deliveredTo: string, deliveredAt }</code></td>
|
|
1404
1534
|
<td><strong>Chat detail screen</strong> — add on mount, remove on unmount.</td>
|
|
1405
1535
|
</tr>
|
|
1406
1536
|
<tr>
|
package/package.json
CHANGED