@droponair/sdk-js 0.25.0 → 0.25.1
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/CHANGELOG.md +29 -14
- package/README.md +7 -7
- package/dist/attachment/attachment-client.d.ts +1 -1
- package/dist/attachment/attachment-client.js +1 -1
- package/dist/core/messaging-client.d.ts +2 -2
- package/dist/core/messaging-client.js +10 -10
- package/dist/core/types.d.ts +4 -4
- package/dist/index.js +3 -3
- package/dist/transport/auto-select.d.ts +1 -1
- package/dist/transport/auto-select.js +1 -1
- package/dist/transport/protobuf-codec.d.ts +1 -1
- package/dist/transport/protobuf-codec.js +1 -1
- package/dist/transport/sse-transport.d.ts +1 -1
- package/dist/transport/sse-transport.js +1 -1
- package/dist/transport/webtransport-transport.d.ts +3 -3
- package/dist/transport/webtransport-transport.js +3 -3
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.25.1
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
|
|
7
|
+
- Documentation only, no behaviour or API change. Comments and notes that shipped in the
|
|
8
|
+
package described the platform's own internals rather than the integration surface: some
|
|
9
|
+
named components a consumer never talks to, and some carried planning tags that mean nothing
|
|
10
|
+
outside our own backlog. They are rewritten in terms of what the code does and what the
|
|
11
|
+
platform offers.
|
|
12
|
+
- Where availability used to be described as a specific plan flag, it now points at the pricing
|
|
13
|
+
page and the app's subscription, which are the two places that stay correct as plans change.
|
|
14
|
+
- `PROTOCOL_VERSION` references are untouched. That is the contract a consumer integrates
|
|
15
|
+
against and it remains the way to tell what a relay supports.
|
|
16
|
+
- Em dashes are gone from the shipped text, per the house style. Each was judged in place
|
|
17
|
+
rather than swapped mechanically, so clauses read as sentences rather than comma splices.
|
|
18
|
+
|
|
3
19
|
## 0.25.0
|
|
4
20
|
|
|
5
21
|
### Added
|
|
@@ -43,7 +59,7 @@
|
|
|
43
59
|
|
|
44
60
|
## 0.24.2
|
|
45
61
|
|
|
46
|
-
- Fix: E2EE group message decryption failed because the decrypt AAD bound `recipientId` to the group id instead of the receiving user's own id (which is what the sender encrypts against). Now matches the sender and the other SDKs. Requires
|
|
62
|
+
- Fix: E2EE group message decryption failed because the decrypt AAD bound `recipientId` to the group id instead of the receiving user's own id (which is what the sender encrypts against). Now matches the sender and the other SDKs. Requires a relay that preserves the sender timestamp on group notifications.
|
|
47
63
|
|
|
48
64
|
## 0.24.1
|
|
49
65
|
|
|
@@ -221,7 +237,7 @@ This project follows [Semantic Versioning](https://semver.org/).
|
|
|
221
237
|
|
|
222
238
|
### Changed
|
|
223
239
|
|
|
224
|
-
- **`revokeAttachment` accepts an `AttachmentRef`.** Calling `revokeAttachment(ref)` now also revokes the linked preview thumbnail (`ref.thumbnailAttachmentId`) in the same call. `revokeAttachment(attachmentId)` with a plain id string is unchanged and revokes only that one attachment. Additive
|
|
240
|
+
- **`revokeAttachment` accepts an `AttachmentRef`.** Calling `revokeAttachment(ref)` now also revokes the linked preview thumbnail (`ref.thumbnailAttachmentId`) in the same call. `revokeAttachment(attachmentId)` with a plain id string is unchanged and revokes only that one attachment. Additive, so no breaking change.
|
|
225
241
|
|
|
226
242
|
---
|
|
227
243
|
|
|
@@ -230,13 +246,13 @@ This project follows [Semantic Versioning](https://semver.org/).
|
|
|
230
246
|
### Added
|
|
231
247
|
|
|
232
248
|
- **Group read receipts.** When a group has `readReceiptsVisibleToGroup` enabled, a member's `markRead(messageId, groupId)` is fanned to every other member, not just the reader's own devices. The inbound `ReadReceiptEvent` now carries `fromUserId` so you know which member read the message. New `client.updateGroup(groupId, { name?, readReceiptsVisibleToGroup? })` controls the per-group flag (it is a group-level choice; off by default). Broadcasts stay own-device only by design.
|
|
233
|
-
- **Attachment revoke.** New `client.revokeAttachment(attachmentId)
|
|
234
|
-
- **Attachment preview thumbnails.** `prepareAttachmentAndUpload` accepts an optional `thumbnail` (and `thumbnailMimeType`). Entirely optional
|
|
249
|
+
- **Attachment revoke.** New `client.revokeAttachment(attachmentId)`. The platform stops issuing download URLs for it and recipients with a live connection get an `ATTACHMENT_REVOKED` event via `onEvent` (metadata = attachmentId). Bytes already downloaded cannot be recalled.
|
|
250
|
+
- **Attachment preview thumbnails.** `prepareAttachmentAndUpload` accepts an optional `thumbnail` (and `thumbnailMimeType`). Entirely optional: if provided, the SDK uploads it as a separate attachment encrypted the same way and links it via `AttachmentRef.thumbnailAttachmentId`; download it like any attachment. If omitted, there is simply no thumbnail.
|
|
235
251
|
|
|
236
252
|
### Notes
|
|
237
253
|
|
|
238
254
|
- Download authorization for GROUP attachments is now checked against *current* group membership: a user removed from a group can no longer download its attachments even if they were a recipient at upload time.
|
|
239
|
-
- No PROTOCOL_VERSION change
|
|
255
|
+
- No PROTOCOL_VERSION change: additive proto fields (`SyncFrame.fromUserId`, `AttachmentRef.thumbnailAttachmentId`) and an additive event type.
|
|
240
256
|
|
|
241
257
|
---
|
|
242
258
|
|
|
@@ -244,14 +260,14 @@ This project follows [Semantic Versioning](https://semver.org/).
|
|
|
244
260
|
|
|
245
261
|
### Added
|
|
246
262
|
|
|
247
|
-
- **Notification clear sync.** `client.clearNotification(conversationId)` tells the user's other devices a conversation's notifications were dismissed; `client.onNotificationCleared(cb)` listens for it. Always available (no opt-out)
|
|
263
|
+
- **Notification clear sync.** `client.clearNotification(conversationId)` tells the user's other devices a conversation's notifications were dismissed; `client.onNotificationCleared(cb)` listens for it. Always available (no opt-out), since it is plain own-device hygiene.
|
|
248
264
|
- **Draft sync.** `client.syncDraft(conversationId, draftText)` pushes a conversation draft to the user's other devices; `client.onDraftSync(cb)` listens for it. **Opt-in:** the app owner enables it in the dashboard, and the draft text crosses the relay in cleartext (fanned out, never stored). When disabled the server drops the frame.
|
|
249
265
|
- New exported types: `NotificationClearEvent` / `NotificationClearCallback`, `DraftSyncEvent` / `DraftSyncCallback`.
|
|
250
266
|
|
|
251
267
|
### Notes
|
|
252
268
|
|
|
253
269
|
- Both ride the existing `SyncFrame` wire type (own-device fan-out only, never delivered to a different user). No PROTOCOL_VERSION change.
|
|
254
|
-
- Your app decides when to call `clearNotification()` / `syncDraft()
|
|
270
|
+
- Your app decides when to call `clearNotification()` / `syncDraft()`. The platform never infers dismissal or tracks drafts.
|
|
255
271
|
|
|
256
272
|
---
|
|
257
273
|
|
|
@@ -259,13 +275,13 @@ This project follows [Semantic Versioning](https://semver.org/).
|
|
|
259
275
|
|
|
260
276
|
### Added
|
|
261
277
|
|
|
262
|
-
- **Cross-device read receipts.** New `client.markRead(messageId, conversationId?)` reports a message as read; the receipt is relayed to the user's *other* devices (never to the message's sender). New `client.onReadReceipt(callback)` listens for receipts reported by the user's other devices
|
|
278
|
+
- **Cross-device read receipts.** New `client.markRead(messageId, conversationId?)` reports a message as read; the receipt is relayed to the user's *other* devices (never to the message's sender). New `client.onReadReceipt(callback)` listens for receipts reported by the user's other devices. Use it to clear unread state your app maintains.
|
|
263
279
|
- New exported `ReadReceiptEvent` type and `ReadReceiptCallback`.
|
|
264
280
|
- **PROTOCOL_VERSION bumped to 6.** Additive only: new `SyncFrame` wire type. Existing 0.10.x clients keep working against the new server.
|
|
265
281
|
|
|
266
282
|
### Notes
|
|
267
283
|
|
|
268
|
-
- The platform is deliberately unopinionated: **your app decides when `markRead()` is called
|
|
284
|
+
- The platform is deliberately unopinionated: **your app decides when `markRead()` is called**. The server never infers read state, and unread counts stay client-side. The app owner can disable read receipts entirely from the dashboard, in which case the server silently drops the frame.
|
|
269
285
|
- This release is own-device sync only: the *sender* of a message is not told when a recipient read it. Sender-side read notifications are a separate future capability.
|
|
270
286
|
|
|
271
287
|
---
|
|
@@ -274,7 +290,7 @@ This project follows [Semantic Versioning](https://semver.org/).
|
|
|
274
290
|
|
|
275
291
|
### Added
|
|
276
292
|
|
|
277
|
-
- **Device trust.** New `client.listMyDevices()` returns the current user's registered devices; `client.revokeMyDevice(deviceId)` revokes one of them. A revoked device's live session is closed immediately and all future connections from it are denied (revoke is permanent
|
|
293
|
+
- **Device trust.** New `client.listMyDevices()` returns the current user's registered devices; `client.revokeMyDevice(deviceId)` revokes one of them. A revoked device's live session is closed immediately and all future connections from it are denied (revoke is permanent, and re-registering yields a fresh deviceId).
|
|
278
294
|
- **`DEVICE_REVOKED` event.** When this device is revoked (from another of the user's devices, or by the app owner), the SDK stops its reconnect loop, closes the socket, and surfaces a `DEVICE_REVOKED` event through `onEvent` so the app can clear local key storage and show a re-register prompt.
|
|
279
295
|
- New exported `DeviceInfo` type.
|
|
280
296
|
|
|
@@ -326,7 +342,7 @@ This project follows [Semantic Versioning](https://semver.org/).
|
|
|
326
342
|
### Notes
|
|
327
343
|
|
|
328
344
|
- Wire protocol unchanged (PROTOCOL_VERSION stays 4). The proto schema was already correct; only the JS hand-rolled codec was out of sync.
|
|
329
|
-
- `protoFieldNumbers` for the group types are now documented
|
|
345
|
+
- `protoFieldNumbers` for the group types are now documented alongside the shared protocol test vectors, for cross-platform reference.
|
|
330
346
|
|
|
331
347
|
---
|
|
332
348
|
|
|
@@ -395,9 +411,8 @@ This project follows [Semantic Versioning](https://semver.org/).
|
|
|
395
411
|
`getDisplayMedia()` (web) / `MediaProjection` (Android) / `ReplayKit` (iOS)
|
|
396
412
|
in the app, add the track to the existing peer connection, then call
|
|
397
413
|
`startScreenShare(...)` to notify the peer.
|
|
398
|
-
-
|
|
399
|
-
|
|
400
|
-
side, on the customer's backend).
|
|
414
|
+
- Availability depends on the app's plan; see the pricing page or the app's
|
|
415
|
+
subscription in the dashboard.
|
|
401
416
|
|
|
402
417
|
---
|
|
403
418
|
|
package/README.md
CHANGED
|
@@ -154,7 +154,7 @@ unchanged, so peers still address the same identity and existing conversations k
|
|
|
154
154
|
|
|
155
155
|
### Cross-device read receipts
|
|
156
156
|
|
|
157
|
-
Available since SDK `0.11.0`. **Your app decides when a message is read
|
|
157
|
+
Available since SDK `0.11.0`. **Your app decides when a message is read**, and the platform never infers it. Call `markRead()` at that moment; the receipt syncs to the user's *other* devices so they can clear their unread UI. It is not sent to the message's sender. The app owner can switch read receipts off entirely from the dashboard.
|
|
158
158
|
|
|
159
159
|
```typescript
|
|
160
160
|
// When your UI decides the message has been read
|
|
@@ -162,11 +162,11 @@ client.markRead(messageId, peerUserId);
|
|
|
162
162
|
|
|
163
163
|
// On the user's other devices
|
|
164
164
|
client.onReadReceipt(e => {
|
|
165
|
-
// e.messageId was read elsewhere
|
|
165
|
+
// e.messageId was read elsewhere, so clear your unread state for it
|
|
166
166
|
});
|
|
167
167
|
```
|
|
168
168
|
|
|
169
|
-
**Group read receipts.** Since SDK `0.13.0`, a group can opt into sharing read receipts with every member. Call `updateGroup(groupId, { readReceiptsVisibleToGroup: true })` (owner/admin); after that, a member's `markRead()` on a group message is broadcast to every other member, and `onReadReceipt` fires with `e.fromUserId` set to the member who read it. It is **opt-in per group
|
|
169
|
+
**Group read receipts.** Since SDK `0.13.0`, a group can opt into sharing read receipts with every member. Call `updateGroup(groupId, { readReceiptsVisibleToGroup: true })` (owner/admin); after that, a member's `markRead()` on a group message is broadcast to every other member, and `onReadReceipt` fires with `e.fromUserId` set to the member who read it. It is **opt-in per group**. The platform never enables it for you, and it has no effect unless read receipts are also enabled for your app.
|
|
170
170
|
|
|
171
171
|
```typescript
|
|
172
172
|
await client.updateGroup(groupId, { readReceiptsVisibleToGroup: true });
|
|
@@ -178,7 +178,7 @@ client.onReadReceipt(e => {
|
|
|
178
178
|
|
|
179
179
|
### Notification clear & draft sync
|
|
180
180
|
|
|
181
|
-
Available since SDK `0.12.0`, both own-device only. `clearNotification()` tells your user's other devices a conversation's notifications were dismissed
|
|
181
|
+
Available since SDK `0.12.0`, both own-device only. `clearNotification()` tells your user's other devices a conversation's notifications were dismissed, and is always available. `syncDraft()` pushes a draft so the user can keep typing on another device, and is **opt-in** (the app owner enables it in the dashboard) and the draft text crosses the relay in cleartext.
|
|
182
182
|
|
|
183
183
|
```typescript
|
|
184
184
|
client.clearNotification(conversationId);
|
|
@@ -190,7 +190,7 @@ client.onDraftSync(e => { /* pre-fill composer with e.draftText */ });
|
|
|
190
190
|
|
|
191
191
|
### Device trust
|
|
192
192
|
|
|
193
|
-
Available since SDK `0.10.0`. Any device that completes a connection is implicitly trusted. `listMyDevices()` powers a "Your devices" screen; `revokeMyDevice()` cuts a device off immediately. When the *current* device is revoked, the SDK stops reconnecting and emits a `DEVICE_REVOKED` event via `onEvent
|
|
193
|
+
Available since SDK `0.10.0`. Any device that completes a connection is implicitly trusted. `listMyDevices()` powers a "Your devices" screen; `revokeMyDevice()` cuts a device off immediately. When the *current* device is revoked, the SDK stops reconnecting and emits a `DEVICE_REVOKED` event via `onEvent`. Listen for it to clear local key storage and prompt re-registration.
|
|
194
194
|
|
|
195
195
|
```typescript
|
|
196
196
|
const devices = await client.listMyDevices();
|
|
@@ -479,7 +479,7 @@ await wt.connect();
|
|
|
479
479
|
await wt.sendEnvelope(envelopeBytes);
|
|
480
480
|
```
|
|
481
481
|
|
|
482
|
-
Uses the browser-native `WebTransport` API; opens a single bidirectional stream and rides raw bytes both ways. Browser support: Chromium 97+ (stable), Firefox 125+ (stable), Safari Technology Preview only, Node 22+ behind experimental flags. The
|
|
482
|
+
Uses the browser-native `WebTransport` API; opens a single bidirectional stream and rides raw bytes both ways. Browser support: Chromium 97+ (stable), Firefox 125+ (stable), Safari Technology Preview only, Node 22+ behind experimental flags. The endpoint advertises `transports: ["webtransport"]` only where the lane is available; check `GET /api/info.transports` and `features.transport_webtransport` to detect it. Bring your own protobuf decoder. WebSocket remains the default; this primitive is purely opt-in.
|
|
483
483
|
|
|
484
484
|
### Transport auto-select
|
|
485
485
|
|
|
@@ -500,7 +500,7 @@ Foundation for an `init({ transport: 'auto' })` shortcut once full `MessagingCli
|
|
|
500
500
|
|
|
501
501
|
### Call Recording
|
|
502
502
|
|
|
503
|
-
Available since SDK `0.16.0`. The SDK **signals** recording state on a group or room call; your app does the actual media capture (`MediaRecorder`) and uploads the file to your own storage
|
|
503
|
+
Available since SDK `0.16.0`. The SDK **signals** recording state on a group or room call; your app does the actual media capture (`MediaRecorder`) and uploads the file to your own storage. The platform never holds the media. The recording signal is broadcast to every participant (including anyone who joins later); that transparency is enforced server-side.
|
|
504
504
|
|
|
505
505
|
| Method | Description |
|
|
506
506
|
|--------|-------------|
|
|
@@ -44,7 +44,7 @@ export declare class AttachmentClient {
|
|
|
44
44
|
*/
|
|
45
45
|
prepareAttachmentAndUpload(input: Uint8Array, opts: PrepareAttachmentOptions): Promise<AttachmentRef>;
|
|
46
46
|
/**
|
|
47
|
-
* Revoke an attachment you sent
|
|
47
|
+
* Revoke an attachment you sent. After revoke the platform
|
|
48
48
|
* refuses to issue further download URLs and recipients with a live
|
|
49
49
|
* connection get an ATTACHMENT_REVOKED event. Bytes a recipient already
|
|
50
50
|
* downloaded cannot be recalled.
|
|
@@ -147,7 +147,7 @@ class AttachmentClient {
|
|
|
147
147
|
};
|
|
148
148
|
}
|
|
149
149
|
/**
|
|
150
|
-
* Revoke an attachment you sent
|
|
150
|
+
* Revoke an attachment you sent. After revoke the platform
|
|
151
151
|
* refuses to issue further download URLs and recipients with a live
|
|
152
152
|
* connection get an ATTACHMENT_REVOKED event. Bytes a recipient already
|
|
153
153
|
* downloaded cannot be recalled.
|
|
@@ -39,7 +39,7 @@ export declare class MessagingClient implements DropOnAirClient {
|
|
|
39
39
|
/** Pending startGroupCall resolver. */
|
|
40
40
|
private pendingGroupInviteResolve;
|
|
41
41
|
private pendingGroupInviteReject;
|
|
42
|
-
/** Pending joinRoom resolver
|
|
42
|
+
/** Pending joinRoom resolver, keyed by roomId. */
|
|
43
43
|
private readonly pendingRoomJoins;
|
|
44
44
|
private reconnectDelayMs;
|
|
45
45
|
/** Schedule a single reconnect, replacing any pending one (never stack timers). */
|
|
@@ -238,7 +238,7 @@ export declare class MessagingClient implements DropOnAirClient {
|
|
|
238
238
|
getGroup(groupId: string): Promise<GroupInfo>;
|
|
239
239
|
/**
|
|
240
240
|
* Update a group. Any omitted field is left unchanged. `readReceiptsVisibleToGroup`
|
|
241
|
-
*
|
|
241
|
+
* controls whether members' group read receipts are visible to
|
|
242
242
|
* the whole group or stay own-device only.
|
|
243
243
|
*/
|
|
244
244
|
updateGroup(groupId: string, update: {
|
|
@@ -246,7 +246,7 @@ class MessagingClient {
|
|
|
246
246
|
/** Pending startGroupCall resolver. */
|
|
247
247
|
this.pendingGroupInviteResolve = null;
|
|
248
248
|
this.pendingGroupInviteReject = null;
|
|
249
|
-
/** Pending joinRoom resolver
|
|
249
|
+
/** Pending joinRoom resolver, keyed by roomId. */
|
|
250
250
|
this.pendingRoomJoins = new Map();
|
|
251
251
|
this.messageListeners = new Set();
|
|
252
252
|
this.eventListeners = new Set();
|
|
@@ -658,7 +658,7 @@ class MessagingClient {
|
|
|
658
658
|
this.transport.send(this.codec.encodePushRegistrationFrame(frame));
|
|
659
659
|
}
|
|
660
660
|
// ---------------------------------------------------------------------------
|
|
661
|
-
// Device trust (PROTOCOL_VERSION 5+
|
|
661
|
+
// Device trust (PROTOCOL_VERSION 5+)
|
|
662
662
|
// ---------------------------------------------------------------------------
|
|
663
663
|
/**
|
|
664
664
|
* List the current user's registered devices. Each device is implicitly
|
|
@@ -711,7 +711,7 @@ class MessagingClient {
|
|
|
711
711
|
}
|
|
712
712
|
}
|
|
713
713
|
// ---------------------------------------------------------------------------
|
|
714
|
-
// Cross-device read receipts (PROTOCOL_VERSION 6+
|
|
714
|
+
// Cross-device read receipts (PROTOCOL_VERSION 6+)
|
|
715
715
|
// ---------------------------------------------------------------------------
|
|
716
716
|
/**
|
|
717
717
|
* Mark a message as read. Call this when YOUR app decides a message has
|
|
@@ -950,7 +950,7 @@ class MessagingClient {
|
|
|
950
950
|
}
|
|
951
951
|
/**
|
|
952
952
|
* Update a group. Any omitted field is left unchanged. `readReceiptsVisibleToGroup`
|
|
953
|
-
*
|
|
953
|
+
* controls whether members' group read receipts are visible to
|
|
954
954
|
* the whole group or stay own-device only.
|
|
955
955
|
*/
|
|
956
956
|
async updateGroup(groupId, update) {
|
|
@@ -995,7 +995,7 @@ class MessagingClient {
|
|
|
995
995
|
throw new Error(`deleteGroup failed (HTTP ${res.status})`);
|
|
996
996
|
}
|
|
997
997
|
// ---------------------------------------------------------------------------
|
|
998
|
-
// Rooms (
|
|
998
|
+
// Rooms (scheduled & persistent meeting rooms)
|
|
999
999
|
// ---------------------------------------------------------------------------
|
|
1000
1000
|
async createRoom(options) {
|
|
1001
1001
|
const jwt = await this.getValidDropOnAirJwt(false);
|
|
@@ -1325,7 +1325,7 @@ class MessagingClient {
|
|
|
1325
1325
|
return () => this.groupCallListeners.delete(callback);
|
|
1326
1326
|
}
|
|
1327
1327
|
// Group call moderation + waiting room. The server validates host/co-host
|
|
1328
|
-
// authority and
|
|
1328
|
+
// authority and whether moderation is available on the app's plan; on denial it
|
|
1329
1329
|
// emits a LIMIT_REACHED event with reason="MODERATION_NOT_ENABLED".
|
|
1330
1330
|
transferHost(callId, groupId, newHostUserId) {
|
|
1331
1331
|
this.sendGroupCallFrame({
|
|
@@ -1399,7 +1399,7 @@ class MessagingClient {
|
|
|
1399
1399
|
payload: JSON.stringify({ userId }),
|
|
1400
1400
|
});
|
|
1401
1401
|
}
|
|
1402
|
-
// Live stage controls
|
|
1402
|
+
// Live stage controls. These act on a room call running in
|
|
1403
1403
|
// stage mode; pass the callId from joinRoom(). raiseHand / lowerHand and
|
|
1404
1404
|
// submitStageQuestion are open to any participant; promote / demote are
|
|
1405
1405
|
// host / co-host authority. Roles surface via GROUP_CALL_ROLE_CHANGED.
|
|
@@ -1428,7 +1428,7 @@ class MessagingClient {
|
|
|
1428
1428
|
submitStageQuestion(callId, text) {
|
|
1429
1429
|
this.sendGroupCallFrame({ type: 'GROUP_CALL_STAGE_QUESTION', callId, groupId: '', payload: text });
|
|
1430
1430
|
}
|
|
1431
|
-
// Call recording
|
|
1431
|
+
// Call recording. These SIGNAL recording state; the actual
|
|
1432
1432
|
// media capture + upload to your storage is your app's job (same split as
|
|
1433
1433
|
// screen sharing). The platform broadcasts the signal to every participant.
|
|
1434
1434
|
startRecording(callId) {
|
|
@@ -1589,7 +1589,7 @@ class MessagingClient {
|
|
|
1589
1589
|
plaintext = await this.cryptoService.decrypt(myPayload.encryptedPayload, sharedKey, {
|
|
1590
1590
|
messageId: notif.messageId,
|
|
1591
1591
|
senderId: notif.fromUserId,
|
|
1592
|
-
// AAD recipientId is the receiving user's own id
|
|
1592
|
+
// AAD recipientId is the receiving user's own id, and this MUST match the
|
|
1593
1593
|
// sender's encrypt AAD, which binds recipientId to the target member's
|
|
1594
1594
|
// userId (memberId). Using notif.groupId here (the previous value) never
|
|
1595
1595
|
// matched, so E2EE group messages failed GCM auth on decrypt. android /
|
|
@@ -1634,7 +1634,7 @@ class MessagingClient {
|
|
|
1634
1634
|
this.pendingGroupInviteReject = null;
|
|
1635
1635
|
reject(new Error(`GROUP_CALL_ALREADY_ACTIVE:${wire.payload ?? ''}`));
|
|
1636
1636
|
}
|
|
1637
|
-
// Resolve / reject a pending joinRoom()
|
|
1637
|
+
// Resolve / reject a pending joinRoom(). Room-call frames
|
|
1638
1638
|
// carry roomId; the join outcome is one of these four types.
|
|
1639
1639
|
if (wire.roomId) {
|
|
1640
1640
|
const pending = this.pendingRoomJoins.get(wire.roomId);
|
package/dist/core/types.d.ts
CHANGED
|
@@ -117,7 +117,7 @@ export interface GroupInfo {
|
|
|
117
117
|
members: GroupMemberInfo[];
|
|
118
118
|
createdAt: number;
|
|
119
119
|
/**
|
|
120
|
-
*
|
|
120
|
+
* When true, a member's group read receipt is fanned to all other
|
|
121
121
|
* members; when false it stays own-device only. Controlled via updateGroup().
|
|
122
122
|
*/
|
|
123
123
|
readReceiptsVisibleToGroup?: boolean;
|
|
@@ -140,7 +140,7 @@ export interface GroupCallEvent {
|
|
|
140
140
|
type: GroupCallEventType | string;
|
|
141
141
|
callId: string;
|
|
142
142
|
groupId: string;
|
|
143
|
-
/** Set instead of groupId when the event belongs to a room call
|
|
143
|
+
/** Set instead of groupId when the event belongs to a room call. */
|
|
144
144
|
roomId?: string;
|
|
145
145
|
targetUserId?: string;
|
|
146
146
|
payload?: string;
|
|
@@ -160,7 +160,7 @@ export interface RoomPolicy {
|
|
|
160
160
|
/** When true, the room flips to CLOSED once the last participant leaves the call. */
|
|
161
161
|
autoCloseWhenEmpty?: boolean;
|
|
162
162
|
/**
|
|
163
|
-
* When true, the room's live call runs in stage mode
|
|
163
|
+
* When true, the room's live call runs in stage mode: hosts
|
|
164
164
|
* join as speakers, everyone else as receive-only audience who can raise a
|
|
165
165
|
* hand to be promoted. Mesh-scale - suited to panels and small stages.
|
|
166
166
|
*/
|
|
@@ -191,7 +191,7 @@ export interface SfuToken {
|
|
|
191
191
|
expiresAt: number;
|
|
192
192
|
}
|
|
193
193
|
/**
|
|
194
|
-
* A server-side recording of an SFU-mode room
|
|
194
|
+
* A server-side recording of an SFU-mode room. The platform
|
|
195
195
|
* never holds the recorded bytes - LiveKit Egress uploads the finalized file
|
|
196
196
|
* directly to the destination configured in the panel under `destinationId`.
|
|
197
197
|
*/
|
package/dist/index.js
CHANGED
|
@@ -59,13 +59,13 @@ async function initialize(options) {
|
|
|
59
59
|
}
|
|
60
60
|
return client;
|
|
61
61
|
}
|
|
62
|
-
//
|
|
62
|
+
// HTTP fallback lane primitive for restrictive networks.
|
|
63
63
|
var sse_transport_1 = require("./transport/sse-transport");
|
|
64
64
|
Object.defineProperty(exports, "SseTransport", { enumerable: true, get: function () { return sse_transport_1.SseTransport; } });
|
|
65
|
-
//
|
|
65
|
+
// WebTransport (HTTP/3) lane primitive.
|
|
66
66
|
var webtransport_transport_1 = require("./transport/webtransport-transport");
|
|
67
67
|
Object.defineProperty(exports, "WebTransportTransport", { enumerable: true, get: function () { return webtransport_transport_1.WebTransportTransport; } });
|
|
68
|
-
//
|
|
68
|
+
// transport auto-select - intersects runtime + platform support.
|
|
69
69
|
var auto_select_1 = require("./transport/auto-select");
|
|
70
70
|
Object.defineProperty(exports, "selectTransport", { enumerable: true, get: function () { return auto_select_1.selectTransport; } });
|
|
71
71
|
/**
|
|
@@ -116,7 +116,7 @@ export interface WireGroupCallFrame {
|
|
|
116
116
|
groupId: string;
|
|
117
117
|
targetUserId?: string;
|
|
118
118
|
payload?: string;
|
|
119
|
-
/** Set instead of groupId when the multi-party call belongs to a Room
|
|
119
|
+
/** Set instead of groupId when the multi-party call belongs to a Room. */
|
|
120
120
|
roomId?: string;
|
|
121
121
|
}
|
|
122
122
|
/**
|
|
@@ -404,7 +404,7 @@ class ProtobufCodec {
|
|
|
404
404
|
// Event.type is a SCREAMING_SNAKE_CASE enum string (e.g. LIMIT_REACHED).
|
|
405
405
|
// A GroupMessageNotification, BroadcastNotification, or Ack decoded here
|
|
406
406
|
// carries a UUID (messageId / broadcastId) in field 1, which never matches
|
|
407
|
-
// this shape
|
|
407
|
+
// this shape, so this reliably rejects those overlapping frame types and
|
|
408
408
|
// lets Event be probed before them.
|
|
409
409
|
if (!decoded.type || !/^[A-Z][A-Z0-9_]*$/.test(decoded.type)) {
|
|
410
410
|
return null;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* WebTransport (HTTP/3) lane primitive
|
|
2
|
+
* WebTransport (HTTP/3) lane primitive.
|
|
3
3
|
*
|
|
4
|
-
* Standalone client for the platform's WebTransport endpoint,
|
|
5
|
-
* the
|
|
4
|
+
* Standalone client for the platform's WebTransport endpoint, which carries
|
|
5
|
+
* the same session as the WebSocket lane.
|
|
6
6
|
* Browser-native `WebTransport` API; no polyfill ships with the SDK.
|
|
7
7
|
*
|
|
8
8
|
* Browser support as of 2026-05:
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* WebTransport (HTTP/3) lane primitive
|
|
3
|
+
* WebTransport (HTTP/3) lane primitive.
|
|
4
4
|
*
|
|
5
|
-
* Standalone client for the platform's WebTransport endpoint,
|
|
6
|
-
* the
|
|
5
|
+
* Standalone client for the platform's WebTransport endpoint, which carries
|
|
6
|
+
* the same session as the WebSocket lane.
|
|
7
7
|
* Browser-native `WebTransport` API; no polyfill ships with the SDK.
|
|
8
8
|
*
|
|
9
9
|
* Browser support as of 2026-05:
|
package/dist/version.d.ts
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* MINOR, additive feature (e.g. multi-device payloads, new call event type)
|
|
8
8
|
* PATCH, bug-fix / perf improvement with no wire or API change
|
|
9
9
|
*/
|
|
10
|
-
export declare const SDK_VERSION = "0.25.
|
|
10
|
+
export declare const SDK_VERSION = "0.25.1";
|
|
11
11
|
/**
|
|
12
12
|
* Binary encrypted-payload format version.
|
|
13
13
|
* Included as the first byte of every encrypted payload so receivers can
|
package/dist/version.js
CHANGED
|
@@ -10,7 +10,7 @@ exports.PROTOCOL_VERSION = exports.PAYLOAD_FORMAT_VERSION = exports.SDK_VERSION
|
|
|
10
10
|
* MINOR, additive feature (e.g. multi-device payloads, new call event type)
|
|
11
11
|
* PATCH, bug-fix / perf improvement with no wire or API change
|
|
12
12
|
*/
|
|
13
|
-
exports.SDK_VERSION = '0.25.
|
|
13
|
+
exports.SDK_VERSION = '0.25.1';
|
|
14
14
|
/**
|
|
15
15
|
* Binary encrypted-payload format version.
|
|
16
16
|
* Included as the first byte of every encrypted payload so receivers can
|
package/package.json
CHANGED