social.colibri.beta.voice.defs

colibri.social

Schema Diff

+42 -5

From

CID
bafyreihggcvt4fi...
Indexed At
2026-08-23 12:32 UTC
View this version

To

CID
bafyreiegpe7igcq...
Indexed At
2026-08-25 14:45 UTC
View this version

Compatibility Analysis

Breaking Changes Detected

1 breaking change, 13 non-breaking changes.

Breaking Changes (1)
  • KindChanged KindChanged { vertex_id: "social.colibri.beta.voice.defs#transportOptions.iceCandidates", old_kind: "unknown", new_kind: "array" }
Non-Breaking Changes (13)
  • AddedVertex AddedVertex { vertex_id: "social.colibri.beta.voice.defs#disconnected" }
  • AddedVertex AddedVertex { vertex_id: "social.colibri.beta.voice.defs#disconnected.reason" }
  • AddedVertex AddedVertex { vertex_id: "social.colibri.beta.voice.defs#moderationChanged.serverDeafened" }
  • AddedVertex AddedVertex { vertex_id: "social.colibri.beta.voice.defs#moderationChanged.serverMuted" }
  • AddedVertex AddedVertex { vertex_id: "social.colibri.beta.voice.defs#transportOptions.iceCandidates:items" }
  • AddedVertex AddedVertex { vertex_id: "social.colibri.beta.voice.defs#transportOptions.iceServers" }
  • AddedVertex AddedVertex { vertex_id: "social.colibri.beta.voice.defs#transportOptions.iceServers:items" }
  • AddedEdge AddedEdge { src: "social.colibri.beta.voice.defs#disconnected", tgt: "social.colibri.beta.voice.defs#disconnected.reason", kind: "prop", name: Some("reason") }
  • AddedEdge AddedEdge { src: "social.colibri.beta.voice.defs#moderationChanged", tgt: "social.colibri.beta.voice.defs#moderationChanged.serverDeafened", kind: "prop", name: Some("serverDeafened") }
  • AddedEdge AddedEdge { src: "social.colibri.beta.voice.defs#moderationChanged", tgt: "social.colibri.beta.voice.defs#moderationChanged.serverMuted", kind: "prop", name: Some("serverMuted") }
  • AddedEdge AddedEdge { src: "social.colibri.beta.voice.defs#transportOptions", tgt: "social.colibri.beta.voice.defs#transportOptions.iceServers", kind: "prop", name: Some("iceServers") }
  • AddedEdge AddedEdge { src: "social.colibri.beta.voice.defs#transportOptions.iceCandidates", tgt: "social.colibri.beta.voice.defs#transportOptions.iceCandidates:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "social.colibri.beta.voice.defs#transportOptions.iceServers", tgt: "social.colibri.beta.voice.defs#transportOptions.iceServers:items", kind: "items", name: None }

Migration Guidance

Added Elements

  • AddedVertex { vertex_id: "social.colibri.beta.voice.defs#disconnected" }
  • AddedVertex { vertex_id: "social.colibri.beta.voice.defs#disconnected.reason" }
  • AddedVertex { vertex_id: "social.colibri.beta.voice.defs#moderationChanged.serverDeafened" }
  • AddedVertex { vertex_id: "social.colibri.beta.voice.defs#moderationChanged.serverMuted" }
  • AddedVertex { vertex_id: "social.colibri.beta.voice.defs#transportOptions.iceCandidates:items" }
  • AddedVertex { vertex_id: "social.colibri.beta.voice.defs#transportOptions.iceServers" }
  • AddedVertex { vertex_id: "social.colibri.beta.voice.defs#transportOptions.iceServers:items" }

Additional Notes

  • Breaking: KindChanged { vertex_id: "social.colibri.beta.voice.defs#transportOptions.iceCandidates", old_kind: "unknown", new_kind: "array" }
  • Non-breaking: AddedEdge { src: "social.colibri.beta.voice.defs#disconnected", tgt: "social.colibri.beta.voice.defs#disconnected.reason", kind: "prop", name: Some("reason") }
  • Non-breaking: AddedEdge { src: "social.colibri.beta.voice.defs#moderationChanged", tgt: "social.colibri.beta.voice.defs#moderationChanged.serverDeafened", kind: "prop", name: Some("serverDeafened") }
  • Non-breaking: AddedEdge { src: "social.colibri.beta.voice.defs#moderationChanged", tgt: "social.colibri.beta.voice.defs#moderationChanged.serverMuted", kind: "prop", name: Some("serverMuted") }
  • Non-breaking: AddedEdge { src: "social.colibri.beta.voice.defs#transportOptions", tgt: "social.colibri.beta.voice.defs#transportOptions.iceServers", kind: "prop", name: Some("iceServers") }
  • Non-breaking: AddedEdge { src: "social.colibri.beta.voice.defs#transportOptions.iceCandidates", tgt: "social.colibri.beta.voice.defs#transportOptions.iceCandidates:items", kind: "items", name: None }
  • Non-breaking: AddedEdge { src: "social.colibri.beta.voice.defs#transportOptions.iceServers", tgt: "social.colibri.beta.voice.defs#transportOptions.iceServers:items", kind: "items", name: None }
1 1
{
2 2
  "id": "social.colibri.beta.voice.defs",
3 3
  "defs": {
4 4
    "ack": {
5 5
      "type": "object",
6 6
      "required": [],
7 7
      "properties": {},
8 8
      "description": "Answers a heartbeat."
9 9
    },
10 10
    "join": {
11 11
      "type": "object",
12 12
      "required": [
13 13
        "channel"
14 14
      ],
15 15
      "properties": {
16 16
        "channel": {
17 17
          "type": "string",
18 18
          "format": "space-ref",
19 19
          "description": "The voice channel to join."
20 20
        }
21 21
      },
22 22
      "description": "Joins a voice channel. A connection must join before sending any other frame, and joining a second channel leaves the first."
23 23
    },
24 24
    "error": {
25 25
      "type": "object",
26 26
      "required": [
27 27
        "error"
28 28
      ],
29 29
      "properties": {
30 30
        "error": {
31 31
          "type": "string",
32 32
          "description": "Error name.",
33 33
          "knownValues": [
34 34
            "InvalidFrame",
35 35
            "NotJoined",
36 36
            "ChannelNotFound",
37 37
            "NotVoiceChannel",
38 38
            "Forbidden",
39 39
            "NotFound"
40 40
          ]
41 41
        },
42 42
        "message": {
43 43
          "type": "string",
44 44
          "description": "Human-readable detail."
45 45
        }
46 46
      },
47 47
      "description": "Something the client sent could not be acted on."
48 48
    },
49 49
    "leave": {
50 50
      "type": "object",
51 51
      "required": [],
52 52
      "properties": {},
53 53
      "description": "Leaves the voice channel this connection is joined to."
54 54
    },
55 55
    "joined": {
56 56
      "type": "object",
57 57
      "required": [
58 58
        "channel"
59 59
      ],
60 60
      "properties": {
61 61
        "channel": {
62 62
          "type": "string",
63 63
          "format": "space-ref",
64 64
          "description": "The voice channel now joined."
65 65
        }
66 66
      },
67 67
      "description": "Confirms this connection has joined a voice channel."
68 68
    },
69 69
    "consume": {
70 70
      "type": "object",
71 71
      "required": [
72 72
        "transportId",
73 73
        "producerId",
74 74
        "rtpCapabilities"
75 75
      ],
76 76
      "properties": {
77 77
        "producerId": {
78 78
          "type": "string",
79 79
          "description": "The producer to consume."
80 80
        },
81 81
        "transportId": {
82 82
          "type": "string",
83 83
          "description": "The receive transport to consume on."
84 84
        },
85 85
        "rtpCapabilities": {
86 86
          "type": "unknown",
87 87
          "description": "This connection's opaque mediasoup RTP capabilities blob."
88 88
        }
89 89
      },
90 90
      "description": "Starts consuming another peer's producer on a receive transport this connection created."
91 91
    },
92 92
    "produce": {
93 93
      "type": "object",
94 94
      "required": [
95 95
        "transportId",
96 96
        "kind",
97 97
        "rtpParameters",
98 98
        "source"
99 99
      ],
100 100
      "properties": {
101 101
        "kind": {
102 102
          "type": "string",
103 103
          "description": "The media kind.",
104 104
          "knownValues": [
105 105
            "audio",
106 106
            "video"
107 107
          ]
108 108
        },
109 109
        "source": {
110 110
          "type": "string",
111 111
          "description": "What this producer captures.",
112 112
          "knownValues": [
113 113
            "microphone",
114 114
            "camera",
115 115
            "screen"
116 116
          ]
117 117
        },
118 118
        "transportId": {
119 119
          "type": "string",
120 120
          "description": "The send transport to produce on."
121 121
        },
122 122
        "rtpParameters": {
123 123
          "type": "unknown",
124 124
          "description": "The opaque mediasoup RTP parameters blob."
125 125
        }
126 126
      },
127 127
      "description": "Starts producing media on a send transport this connection created."
128 128
    },
129 129
    "peerLeft": {
130 130
      "type": "object",
131 131
      "required": [
132 132
        "did"
133 133
      ],
134 134
      "properties": {
135 135
        "did": {
136 136
          "type": "string",
137 137
          "format": "did",
138 138
          "description": "Who left."
139 139
        }
140 140
      },
141 141
      "description": "A peer left the voice channel this connection is in."
142 142
    },
143 143
    "heartbeat": {
144 144
      "type": "object",
145 145
      "required": [],
146 146
      "properties": {},
147 147
      "description": "Keeps the connection alive. The server answers with an ack."
148 148
    },
149 149
    "peerJoined": {
150 150
      "type": "object",
151 151
      "required": [
152 152
        "did"
153 153
      ],
154 154
      "properties": {
155 155
        "did": {
156 156
          "type": "string",
157 157
          "format": "did",
158 158
          "description": "Who joined."
159 159
        }
160 160
      },
161 161
      "description": "Another peer joined the voice channel this connection is in."
162 162
    },
163 +
    "disconnected": {
164 +
      "type": "object",
165 +
      "required": [],
166 +
      "properties": {
167 +
        "reason": {
168 +
          "type": "string",
169 +
          "description": "Why it happened.",
170 +
          "knownValues": [
171 +
            "moderator",
172 +
            "superseded",
173 +
            "channelGone",
174 +
            "forbidden"
175 +
          ]
176 +
        }
177 +
      },
178 +
      "description": "The server removed this client from the voice channel. Sent only to the client it applies to."
179 +
    },
163 180
    "producerInfo": {
164 181
      "type": "object",
165 182
      "required": [
166 183
        "producerId",
167 184
        "did",
168 185
        "kind"
169 186
      ],
170 187
      "properties": {
171 188
        "did": {
172 189
          "type": "string",
173 190
          "format": "did",
174 191
          "description": "Who is producing this media."
175 192
        },
176 193
        "kind": {
177 194
          "type": "string",
178 195
          "description": "The media kind.",
179 196
          "knownValues": [
180 197
            "audio",
181 198
            "video"
182 199
          ]
183 200
        },
184 201
        "paused": {
185 202
          "type": "boolean",
186 203
          "description": "Whether the producer is currently paused."
187 204
        },
188 205
        "source": {
189 206
          "type": "string",
190 207
          "description": "What the producer captures.",
191 208
          "knownValues": [
192 209
            "microphone",
193 210
            "camera",
194 211
            "screen"
195 212
          ]
196 213
        },
197 214
        "producerId": {
198 215
          "type": "string",
199 216
          "description": "The producer's identifier."
200 217
        }
201 218
      },
202 219
      "description": "A media producer available to consume."
203 220
    },
204 221
    "setSelfState": {
205 222
      "type": "object",
206 223
      "required": [],
207 224
      "properties": {
208 225
        "muted": {
209 226
          "type": "boolean",
210 227
          "description": "Whether the microphone is muted."
211 228
        },
212 229
        "deafened": {
213 230
          "type": "boolean",
214 231
          "description": "Whether incoming audio is silenced."
215 232
        }
216 233
      },
217 234
      "description": "Updates this connection's own mute or deafen state. An absent field leaves the current value unchanged."
218 235
    },
219 236
    "closeProducer": {
220 237
      "type": "object",
221 238
      "required": [
222 239
        "producerId"
223 240
      ],
224 241
      "properties": {
225 242
        "producerId": {
226 243
          "type": "string",
227 244
          "description": "The producer to close."
228 245
        }
229 246
      },
230 247
      "description": "Closes a producer this connection owns."
231 248
    },
232 249
    "resumeConsumer": {
233 250
      "type": "object",
234 251
      "required": [
235 252
        "consumerId"
236 253
      ],
237 254
      "properties": {
238 255
        "consumerId": {
239 256
          "type": "string",
240 257
          "description": "The consumer to resume."
241 258
        }
242 259
      },
243 260
      "description": "Resumes a consumer this connection created, which is created paused by default."
244 261
    },
245 262
    "speakingUpdate": {
246 263
      "type": "object",
247 264
      "required": [
248 265
        "did",
249 266
        "speaking"
250 267
      ],
251 268
      "properties": {
252 269
        "did": {
253 270
          "type": "string",
254 271
          "format": "did",
255 272
          "description": "Who this update is about."
256 273
        },
257 274
        "level": {
258 275
          "type": "integer",
259 276
          "description": "An audio level in dBFS."
260 277
        },
261 278
        "speaking": {
262 279
          "type": "boolean",
263 280
          "description": "Whether they are currently speaking."
264 281
        }
265 282
      },
266 283
      "description": "A change in whether someone is currently speaking."
267 284
    },
268 285
    "consumerOptions": {
269 286
      "type": "object",
270 287
      "required": [
271 288
        "id",
272 289
        "producerId",
273 290
        "kind",
274 291
        "rtpParameters"
275 292
      ],
276 293
      "properties": {
277 294
        "id": {
278 295
          "type": "string",
279 296
          "description": "The consumer's identifier."
280 297
        },
281 298
        "kind": {
282 299
          "type": "string",
283 300
          "description": "The media kind.",
284 301
          "knownValues": [
285 302
            "audio",
286 303
            "video"
287 304
          ]
288 305
        },
289 306
        "producerId": {
290 307
          "type": "string",
291 308
          "description": "The producer being consumed."
292 309
        },
293 310
        "rtpParameters": {
294 311
          "type": "unknown",
295 312
          "description": "The opaque mediasoup RTP parameters blob."
296 313
        }
297 314
      },
298 315
      "description": "Parameters for consuming one producer."
299 316
    },
300 317
    "createTransport": {
301 318
      "type": "object",
302 319
      "required": [
303 320
        "direction"
304 321
      ],
305 322
      "properties": {
306 323
        "direction": {
307 324
          "type": "string",
308 325
          "description": "Whether this transport will send or receive media.",
309 326
          "knownValues": [
310 327
            "send",
311 328
            "recv"
312 329
          ]
313 330
        }
314 331
      },
315 332
      "description": "Requests a new WebRTC transport for the joined channel."
316 333
    },
317 334
    "producerRemoved": {
318 335
      "type": "object",
319 336
      "required": [
320 337
        "producerId",
321 338
        "did"
322 339
      ],
323 340
      "properties": {
324 341
        "did": {
325 342
          "type": "string",
326 343
          "format": "did",
327 344
          "description": "Whose producer this was."
328 345
        },
329 346
        "producerId": {
330 347
          "type": "string",
331 348
          "description": "The producer that closed."
332 349
        }
333 350
      },
334 351
      "description": "A peer's producer closed."
335 352
    },
336 353
    "rtpCapabilities": {
337 354
      "type": "object",
338 355
      "properties": {
339 356
        "payload": {
340 357
          "type": "unknown",
341 358
          "description": "The opaque mediasoup capability blob."
342 359
        }
343 360
      },
344 361
      "description": "The RTP capabilities a WebRTC endpoint supports."
345 362
    },
346 363
    "connectTransport": {
347 364
      "type": "object",
348 365
      "required": [
349 366
        "transportId",
350 367
        "dtlsParameters"
351 368
      ],
352 369
      "properties": {
353 370
        "transportId": {
354 371
          "type": "string",
355 372
          "description": "The transport to connect."
356 373
        },
357 374
        "dtlsParameters": {
358 375
          "type": "unknown",
359 376
          "description": "The opaque mediasoup DTLS parameters blob."
360 377
        }
361 378
      },
362 379
      "description": "Completes DTLS negotiation for a transport this connection created."
363 380
    },
364 381
    "transportOptions": {
365 382
      "type": "object",
366 383
      "required": [
367 384
        "id",
368 385
        "iceParameters",
369 386
        "iceCandidates",
370 387
        "dtlsParameters"
371 388
      ],
372 389
      "properties": {
373 390
        "id": {
374 391
          "type": "string",
375 392
          "description": "The transport's identifier."
376 393
        },
377 394
        "direction": {
378 395
          "type": "string",
379 396
          "description": "Which side of the call this transport carries.",
380 397
          "knownValues": [
381 398
            "send",
382 399
            "recv"
383 400
          ]
384 401
        },
402 +
        "iceServers": {
403 +
          "type": "array",
404 +
          "items": {
405 +
            "type": "unknown",
406 +
            "description": "One opaque RTCIceServer entry."
407 +
          },
408 +
          "description": "STUN and TURN servers the client should use while gathering candidates. Absent when the server has none configured."
409 +
        },
385 410
        "iceCandidates": {
386 -
          "type": "unknown",
387 -
          "description": "The opaque mediasoup ICE candidates blob."
411 +
          "type": "array",
412 +
          "items": {
413 +
            "type": "unknown",
414 +
            "description": "One opaque mediasoup ICE candidate."
415 +
          },
416 +
          "description": "The mediasoup ICE candidates, one opaque blob per candidate. This is an array, not a single object, because that is what a WebRTC transport hands back."
388 417
        },
389 418
        "iceParameters": {
390 419
          "type": "unknown",
391 420
          "description": "The opaque mediasoup ICE parameters blob."
392 421
        },
393 422
        "dtlsParameters": {
394 423
          "type": "unknown",
395 424
          "description": "The opaque mediasoup DTLS parameters blob."
396 425
        }
397 426
      },
398 427
      "description": "Parameters for creating one side of a WebRTC transport."
399 428
    },
400 429
    "moderationChanged": {
401 430
      "type": "object",
402 431
      "required": [
403 432
        "did",
404 433
        "muted",
405 434
        "deafened"
406 435
      ],
407 436
      "properties": {
408 437
        "did": {
409 438
          "type": "string",
410 439
          "format": "did",
411 440
          "description": "Whose state changed."
412 441
        },
413 442
        "muted": {
414 443
          "type": "boolean",
415 -
          "description": "Whether the microphone is server-muted."
444 +
          "description": "Whether the microphone is muted, for any reason."
416 445
        },
417 446
        "deafened": {
418 447
          "type": "boolean",
419 -
          "description": "Whether incoming audio is server-silenced."
448 +
          "description": "Whether incoming audio is silenced, for any reason."
449 +
        },
450 +
        "serverMuted": {
451 +
          "type": "boolean",
452 +
          "description": "Whether a moderator muted them. When this is true the peer cannot unmute themselves."
453 +
        },
454 +
        "serverDeafened": {
455 +
          "type": "boolean",
456 +
          "description": "Whether a moderator deafened them. When this is true the peer cannot undeafen themselves."
420 457
        }
421 458
      },
422 -
      "description": "A peer's server-enforced mute or deafen state changed."
459 +
      "description": "A peer's mute or deafen state changed, whether they did it themselves or a moderator did it to them."
423 460
    },
424 461
    "getRtpCapabilities": {
425 462
      "type": "object",
426 463
      "required": [],
427 464
      "properties": {},
428 465
      "description": "Requests the router's RTP capabilities for the joined channel."
429 466
    }
430 467
  },
431 468
  "$type": "com.atproto.lexicon.schema",
432 469
  "lexicon": 1
433 470
}

Compare Other Versions

Lexicon Garden

@