fix: should now sync with other devices
All checks were successful
Queue Release Build / prepare (push) Successful in 25s
Deploy Web Apps / deploy (push) Successful in 7m8s
Queue Release Build / build-windows (push) Successful in 28m10s
Queue Release Build / build-linux (push) Successful in 44m38s
Queue Release Build / build-android (push) Successful in 18m36s
Queue Release Build / finalize (push) Successful in 1m40s
All checks were successful
Queue Release Build / prepare (push) Successful in 25s
Deploy Web Apps / deploy (push) Successful in 7m8s
Queue Release Build / build-windows (push) Successful in 28m10s
Queue Release Build / build-linux (push) Successful in 44m38s
Queue Release Build / build-android (push) Successful in 18m36s
Queue Release Build / finalize (push) Successful in 1m40s
This commit is contained in:
@@ -52,7 +52,7 @@ Require `Authorization: Bearer`:
|
||||
```
|
||||
|
||||
- `oderId` must match the token's user id when provided.
|
||||
- `clientInstanceId` is a stable per-install UUID generated by the product client (`metoyou.clientInstanceId` in `localStorage`). The signaling server uses it to distinguish multiple WebSocket connections for the same user and to route voice ownership.
|
||||
- `clientInstanceId` is a stable per-tab UUID generated by the product client (`metoyou.clientInstanceId` in `sessionStorage`). The signaling server uses it to distinguish multiple WebSocket connections for the same user and to route voice ownership.
|
||||
- Server responds with `auth_error` or `auth_required` when authentication fails.
|
||||
|
||||
## Multi-device sessions
|
||||
@@ -62,6 +62,39 @@ Require `Authorization: Bearer`:
|
||||
- Voice/WebRTC is exclusive per user: only one `clientInstanceId` may own active voice at a time. Other connections show passive UI and can send `voice_client_takeover` to move voice to the local device.
|
||||
- Stale reconnect hygiene: when a client re-identifies with the same `(oderId, connectionScope, clientInstanceId)` tuple, the server closes the older socket for that tuple.
|
||||
|
||||
### Account-owned state sync (`account_sync`)
|
||||
|
||||
When the same account is logged in on multiple devices, account-owned data is kept in sync through the signaling server:
|
||||
|
||||
| Data | Mechanism |
|
||||
|---|---|
|
||||
| Server chat messages | Existing `chat_message` relay (connection-scoped broadcast) |
|
||||
| Voice / typing | Existing `voice_state` / `user_typing` relays |
|
||||
| Saved servers (join/leave) | `account_sync` payload `saved-room-sync` / `saved-room-remove` |
|
||||
| Profile avatar + card text | `account_sync` `user-avatar-full` + `user-avatar-chunk` |
|
||||
| Custom emoji library | `account_sync` `custom-emoji-full` + `custom-emoji-chunk` |
|
||||
| Friends list | `account_sync` `friend-added` / `friend-removed` |
|
||||
| Server icons, edits, reactions | `account_sync` relay of existing P2P broadcast event types |
|
||||
|
||||
Client rules:
|
||||
|
||||
- `broadcastMessage()` still fans out over peer data channels; relayable events are **also** wrapped in `account_sync` and sent on the WebSocket.
|
||||
- The server forwards `account_sync` to every other open connection for the same `oderId` via `notifyOtherConnectionsForOderId`.
|
||||
- Receivers ignore payloads whose `clientInstanceId` matches the local tab id.
|
||||
- When a new device identifies, the server notifies existing connections with `account_sync_peer_online`; those devices push a full snapshot (saved rooms, friends, profile, emoji library).
|
||||
|
||||
WebSocket envelope:
|
||||
|
||||
```json
|
||||
{
|
||||
"type": "account_sync",
|
||||
"clientInstanceId": "<per-tab-uuid>",
|
||||
"payload": { "type": "saved-room-sync", "room": { "...": "..." } }
|
||||
}
|
||||
```
|
||||
|
||||
Server response to other connections includes `fromUserId` set to the sender's `oderId`.
|
||||
|
||||
## Client storage
|
||||
|
||||
The product client stores tokens per signaling-server base URL in `localStorage` (`metoyou.authTokens`). An HTTP interceptor attaches the bearer token to `/api/*` requests targeting that server.
|
||||
|
||||
Reference in New Issue
Block a user