social.colibri.sync.subscribeEvents
Schema Diff
+5 -1
Compatibility Analysis
Backward Compatible
Backward compatible. 2 non-breaking changes.
Non-Breaking Changes (2)
- AddedVertex AddedVertex { vertex_id: "social.colibri.sync.subscribeEvents#messageEventData.live" }
- AddedEdge AddedEdge { src: "social.colibri.sync.subscribeEvents#messageEventData", tgt: "social.colibri.sync.subscribeEvents#messageEventData.live", kind: "prop", name: Some("live") }
Migration Guidance
Added Elements
AddedVertex { vertex_id: "social.colibri.sync.subscribeEvents#messageEventData.live" }
Additional Notes
- Non-breaking: AddedEdge { src: "social.colibri.sync.subscribeEvents#messageEventData", tgt: "social.colibri.sync.subscribeEvents#messageEventData.live", kind: "prop", name: Some("live") }
1
1
{
2
2
"id": "social.colibri.sync.subscribeEvents",
3
3
"defs": {
4
4
"ack": {
5
5
"type": "object",
6
6
"required": [
7
7
"type"
8
8
],
9
9
"properties": {
10
10
"type": {
11
11
"type": "string",
12
12
"const": "ack"
13
13
}
14
14
},
15
15
"description": "Sent in response to a heartbeat message."
16
16
},
17
17
"main": {
18
18
"type": "subscription",
19
19
"errors": [
20
20
{
21
-
"name": "AuthRequired"
21
+
"name": "AuthRequired",
22
+
"description": "Missing, malformed, or unverifiable service auth."
22
23
}
23
24
],
24
25
"message": {
25
26
"schema": {
26
27
"refs": [
27
28
"lex:social.colibri.sync.subscribeEvents#ack",
28
29
"lex:social.colibri.sync.subscribeEvents#communityEvent",
29
30
"lex:social.colibri.sync.subscribeEvents#memberEvent",
30
31
"lex:social.colibri.sync.subscribeEvents#categoryEvent",
31
32
"lex:social.colibri.sync.subscribeEvents#channelEvent",
32
33
"lex:social.colibri.sync.subscribeEvents#messageEvent",
33
34
"lex:social.colibri.sync.subscribeEvents#reactionEvent",
34
35
"lex:social.colibri.sync.subscribeEvents#userEvent",
35
36
"lex:social.colibri.sync.subscribeEvents#typingEvent",
36
37
"lex:social.colibri.sync.subscribeEvents#voicePresenceEvent",
37
38
"lex:social.colibri.sync.subscribeEvents#voiceStateEvent"
38
39
],
39
40
"type": "union"
40
41
}
41
42
},
42
43
"description": "Opens a WebSocket stream that transmits relevant events for the authenticated user."
43
44
},
44
45
"userEvent": {
45
46
"type": "object",
46
47
"required": [
47
48
"type",
48
49
"data"
49
50
],
50
51
"properties": {
51
52
"data": {
52
53
"ref": "lex:social.colibri.sync.subscribeEvents#userEventData",
53
54
"type": "ref"
54
55
},
55
56
"type": {
56
57
"type": "string",
57
58
"const": "user_event"
58
59
}
59
60
},
60
61
"description": "Sent when a known user has updated their profile or Colibri status."
61
62
},
62
63
"userStatus": {
63
64
"type": "object",
64
65
"required": [
65
66
"state",
66
67
"text"
67
68
],
68
69
"properties": {
69
70
"text": {
70
71
"type": "string"
71
72
},
72
73
"emoji": {
73
74
"type": "string"
74
75
},
75
76
"state": {
76
77
"type": "string",
77
78
"knownValues": [
78
79
"online",
79
80
"away",
80
81
"dnd",
81
82
"offline"
82
83
]
83
84
}
84
85
}
85
86
},
86
87
"humEnvelope": {
87
88
"type": "object",
88
89
"required": [
89
90
"origin",
90
91
"id",
91
92
"ttl",
92
93
"subject",
93
94
"community",
94
95
"event"
95
96
],
96
97
"properties": {
97
98
"id": {
98
99
"type": "string",
99
100
"maxLength": 64,
100
101
"description": "Unique id for this Hum, used by receivers to dedup across relay paths."
101
102
},
102
103
"ttl": {
103
104
"type": "integer",
104
105
"maximum": 8,
105
106
"minimum": 0,
106
107
"description": "Remaining relay hops. Decremented on each forward; a Hum at ttl 0 is delivered locally but never relayed."
107
108
},
108
109
"event": {
109
110
"refs": [
110
111
"lex:social.colibri.sync.subscribeEvents#userEvent",
111
112
"lex:social.colibri.sync.subscribeEvents#typingEvent",
112
113
"lex:social.colibri.sync.subscribeEvents#voicePresenceEvent",
113
114
"lex:social.colibri.sync.subscribeEvents#voiceStateEvent"
114
115
],
115
116
"type": "union",
116
117
"description": "Ephemeral event payload. Only off-protocol types are permitted."
117
118
},
118
119
"origin": {
119
120
"type": "string",
120
121
"format": "did",
121
122
"description": "DID of the AppView that first emitted this Hum."
122
123
},
123
124
"subject": {
124
125
"type": "string",
125
126
"format": "did",
126
127
"description": "The user this event is about. Receiver MUST verify origin equals subject's declared presenceService before trusting or relaying."
127
128
},
128
129
"community": {
129
130
"type": "string",
130
131
"format": "at-uri",
131
132
"description": "Community the event is scoped to. Receiver relays to local clients only if they are members of this community."
132
133
}
133
134
},
134
135
"description": "An off-protocol event relayed between AppViews. The authenticated sender (inter-service auth JWT: aud = receiving AppView did:web, lxm = social.colibri.sync.sendHum) is the origin of record; `origin` is echoed for relay/loop control and MUST match the JWT issuer. Only off-protocol event types are permitted — on-protocol events are never carried by a Hum and are derived from the firehose instead."
135
136
},
136
137
"memberEvent": {
137
138
"type": "object",
138
139
"required": [
139
140
"type",
140
141
"data"
141
142
],
142
143
"properties": {
143
144
"data": {
144
145
"ref": "lex:social.colibri.sync.subscribeEvents#memberEventData",
145
146
"type": "ref"
146
147
},
147
148
"type": {
148
149
"type": "string",
149
150
"const": "member_event"
150
151
}
151
152
},
152
153
"description": "Sent when a member has joined or left a community."
153
154
},
154
155
"typingEvent": {
155
156
"type": "object",
156
157
"required": [
157
158
"type",
158
159
"data"
159
160
],
160
161
"properties": {
161
162
"data": {
162
163
"ref": "lex:social.colibri.sync.subscribeEvents#typingEventData",
163
164
"type": "ref"
164
165
},
165
166
"type": {
166
167
"type": "string",
167
168
"const": "typing_event"
168
169
}
169
170
},
170
171
"description": "Sent when a user is typing in a channel the client is viewing."
171
172
},
172
173
"userProfile": {
173
174
"type": "object",
174
175
"required": [
175
176
"handle"
176
177
],
177
178
"properties": {
178
179
"avatar": {
179
180
"type": "blob"
180
181
},
181
182
"banner": {
182
183
"type": "blob"
183
184
},
184
185
"handle": {
185
186
"type": "string",
186
187
"format": "handle"
187
188
},
188
189
"description": {
189
190
"type": "string"
190
191
},
191
192
"displayName": {
192
193
"type": "string"
193
194
}
194
195
}
195
196
},
196
197
"channelEvent": {
197
198
"type": "object",
198
199
"required": [
199
200
"type",
200
201
"data"
201
202
],
202
203
"properties": {
203
204
"data": {
204
205
"ref": "lex:social.colibri.sync.subscribeEvents#channelEventData",
205
206
"type": "ref"
206
207
},
207
208
"type": {
208
209
"type": "string",
209
210
"const": "channel_event"
210
211
}
211
212
},
212
213
"description": "Sent when a channel has been created, updated, or deleted."
213
214
},
214
215
"messageEvent": {
215
216
"type": "object",
216
217
"required": [
217
218
"type",
218
219
"data"
219
220
],
220
221
"properties": {
221
222
"data": {
222
223
"ref": "lex:social.colibri.sync.subscribeEvents#messageEventData",
223
224
"type": "ref"
224
225
},
225
226
"type": {
226
227
"type": "string",
227
228
"const": "message_event"
228
229
}
229
230
},
230
231
"description": "Sent when a message has been sent, edited, or deleted."
231
232
},
232
233
"categoryEvent": {
233
234
"type": "object",
234
235
"required": [
235
236
"type",
236
237
"data"
237
238
],
238
239
"properties": {
239
240
"data": {
240
241
"ref": "lex:social.colibri.sync.subscribeEvents#categoryEventData",
241
242
"type": "ref"
242
243
},
243
244
"type": {
244
245
"type": "string",
245
246
"const": "category_event"
246
247
}
247
248
},
248
249
"description": "Sent when a category has been created, updated, or deleted."
249
250
},
250
251
"reactionEvent": {
251
252
"type": "object",
252
253
"required": [
253
254
"type",
254
255
"data"
255
256
],
256
257
"properties": {
257
258
"data": {
258
259
"ref": "lex:social.colibri.sync.subscribeEvents#reactionEventData",
259
260
"type": "ref"
260
261
},
261
262
"type": {
262
263
"type": "string",
263
264
"const": "reaction_event"
264
265
}
265
266
},
266
267
"description": "Sent when a reaction has been added to or removed from a message."
267
268
},
268
269
"userEventData": {
269
270
"type": "object",
270
271
"required": [
271
272
"did",
272
273
"profile"
273
274
],
274
275
"properties": {
275
276
"did": {
276
277
"type": "string",
277
278
"format": "did"
278
279
},
279
280
"status": {
280
281
"ref": "lex:social.colibri.sync.subscribeEvents#userStatus",
281
282
"type": "ref"
282
283
},
283
284
"profile": {
284
285
"ref": "lex:social.colibri.sync.subscribeEvents#userProfile",
285
286
"type": "ref"
286
287
}
287
288
}
288
289
},
289
290
"communityEvent": {
290
291
"type": "object",
291
292
"required": [
292
293
"type",
293
294
"data"
294
295
],
295
296
"properties": {
296
297
"data": {
297
298
"ref": "lex:social.colibri.sync.subscribeEvents#communityEventData",
298
299
"type": "ref"
299
300
},
300
301
"type": {
301
302
"type": "string",
302
303
"const": "community_event"
303
304
}
304
305
},
305
306
"description": "Sent when a community has been updated or deleted."
306
307
},
307
308
"memberEventData": {
308
309
"type": "object",
309
310
"required": [
310
311
"event",
311
312
"community"
312
313
],
313
314
"properties": {
314
315
"event": {
315
316
"type": "string",
316
317
"knownValues": [
317
318
"join",
318
319
"leave",
319
320
"roles_updated"
320
321
]
321
322
},
322
323
"member": {
323
324
"ref": "lex:social.colibri.sync.subscribeEvents#memberEventMember",
324
325
"type": "ref",
325
326
"description": "The affected member, hydrated. Present on `join` and `roles_updated`."
326
327
},
327
328
"community": {
328
329
"type": "string",
329
330
"format": "at-uri"
330
331
},
331
332
"memberDid": {
332
333
"type": "string",
333
334
"format": "did",
334
335
"description": "DID of the member who left. Present on `leave`."
335
336
},
336
337
"membership": {
337
338
"type": "string",
338
339
"format": "at-uri"
339
340
}
340
341
}
341
342
},
342
343
"typingEventData": {
343
344
"type": "object",
344
345
"required": [
345
346
"event",
346
347
"channel",
347
348
"did"
348
349
],
349
350
"properties": {
350
351
"did": {
351
352
"type": "string",
352
353
"format": "did"
353
354
},
354
355
"event": {
355
356
"type": "string",
356
357
"knownValues": [
357
358
"start",
358
359
"stop"
359
360
]
360
361
},
361
362
"channel": {
362
363
"type": "string",
363
364
"format": "at-uri"
364
365
}
365
366
}
366
367
},
367
368
"voiceStateEvent": {
368
369
"type": "object",
369
370
"required": [
370
371
"type",
371
372
"data"
372
373
],
373
374
"properties": {
374
375
"data": {
375
376
"ref": "lex:social.colibri.sync.subscribeEvents#voiceStateEventData",
376
377
"type": "ref"
377
378
},
378
379
"type": {
379
380
"type": "string",
380
381
"const": "voice_state_event"
381
382
}
382
383
},
383
384
"description": "Sent when a user's voice state changes within a voice channel. `muted` and `deafened` are the user's own choices; `serverMuted` and `serverDeafened` are moderator-applied and enforced by the SFU. Each field is absent when unchanged."
384
385
},
385
386
"channelEventData": {
386
387
"type": "object",
387
388
"required": [
388
389
"event",
389
390
"uri",
390
391
"community"
391
392
],
392
393
"properties": {
393
394
"uri": {
394
395
"type": "string",
395
396
"format": "at-uri"
396
397
},
397
398
"name": {
398
399
"type": "string"
399
400
},
400
401
"type": {
401
402
"type": "string"
402
403
},
403
404
"event": {
404
405
"type": "string",
405
406
"knownValues": [
406
407
"upsert",
407
408
"delete"
408
409
]
409
410
},
410
411
"category": {
411
412
"type": "string",
412
413
"format": "at-uri"
413
414
},
414
415
"community": {
415
416
"type": "string",
416
417
"format": "at-uri"
417
418
},
418
419
"description": {
419
420
"type": "string"
420
421
}
421
422
}
422
423
},
423
424
"messageEventData": {
424
425
"type": "object",
425
426
"required": [
426
427
"event",
427
428
"uri",
428
429
"channel"
429
430
],
430
431
"properties": {
431
432
"uri": {
432
433
"type": "string",
433
434
"format": "at-uri"
434
435
},
436
+
"live": {
437
+
"type": "boolean"
438
+
},
435
439
"text": {
436
440
"type": "string"
437
441
},
438
442
"event": {
439
443
"type": "string",
440
444
"knownValues": [
441
445
"upsert",
442
446
"delete"
443
447
]
444
448
},
445
449
"edited": {
446
450
"type": "boolean"
447
451
},
448
452
"facets": {
449
453
"type": "array",
450
454
"items": {
451
455
"ref": "lex:social.colibri.richtext.facet",
452
456
"type": "ref"
453
457
}
454
458
},
455
459
"parent": {
456
460
"type": "string",
457
461
"format": "at-uri"
458
462
},
459
463
"channel": {
460
464
"type": "string",
461
465
"format": "at-uri"
462
466
},
463
467
"createdAt": {
464
468
"type": "string",
465
469
"format": "datetime"
466
470
},
467
471
"indexedAt": {
468
472
"type": "string",
469
473
"format": "datetime"
470
474
},
471
475
"attachments": {
472
476
"type": "array",
473
477
"items": {
474
478
"type": "blob"
475
479
}
476
480
}
477
481
}
478
482
},
479
483
"categoryEventData": {
480
484
"type": "object",
481
485
"required": [
482
486
"event",
483
487
"uri",
484
488
"community"
485
489
],
486
490
"properties": {
487
491
"uri": {
488
492
"type": "string",
489
493
"format": "at-uri"
490
494
},
491
495
"name": {
492
496
"type": "string"
493
497
},
494
498
"event": {
495
499
"type": "string",
496
500
"knownValues": [
497
501
"upsert",
498
502
"delete"
499
503
]
500
504
},
501
505
"community": {
502
506
"type": "string",
503
507
"format": "at-uri"
504
508
},
505
509
"channelOrder": {
506
510
"type": "array",
507
511
"items": {
508
512
"type": "string",
509
513
"format": "at-uri"
510
514
}
511
515
}
512
516
}
513
517
},
514
518
"memberEventMember": {
515
519
"type": "object",
516
520
"required": [
517
521
"did",
518
522
"handle",
519
523
"roles",
520
524
"data"
521
525
],
522
526
"properties": {
523
527
"vc": {
524
528
"type": "string",
525
529
"format": "at-uri",
526
530
"description": "AT-URI of the voice channel the member is currently connected to, if any. Only set when that channel belongs to `community`."
527
531
},
528
532
"did": {
529
533
"type": "string",
530
534
"format": "did"
531
535
},
532
536
"data": {
533
537
"ref": "lex:social.colibri.actor.defs#actorData",
534
538
"type": "ref"
535
539
},
536
540
"roles": {
537
541
"type": "array",
538
542
"items": {
539
543
"type": "string",
540
544
"format": "at-uri"
541
545
}
542
546
},
543
547
"handle": {
544
548
"type": "string",
545
549
"format": "handle"
546
550
},
547
551
"vcMuted": {
548
552
"type": "boolean"
549
553
},
550
554
"joinedAt": {
551
555
"type": "string",
552
556
"format": "datetime"
553
557
},
554
558
"nickname": {
555
559
"type": "string"
556
560
},
557
561
"vcDeafened": {
558
562
"type": "boolean"
559
563
}
560
564
},
561
565
"description": "The affected member as carried by a member event. Mirrors `social.colibri.community.defs#memberView`, including the member's current voice channel state so a receiving client can place them in a voice channel without refetching."
562
566
},
563
567
"reactionEventData": {
564
568
"type": "object",
565
569
"required": [
566
570
"event",
567
571
"uri",
568
572
"emoji",
569
573
"target",
570
574
"channel"
571
575
],
572
576
"properties": {
573
577
"uri": {
574
578
"type": "string",
575
579
"format": "at-uri"
576
580
},
577
581
"emoji": {
578
582
"type": "string"
579
583
},
580
584
"event": {
581
585
"type": "string",
582
586
"knownValues": [
583
587
"added",
584
588
"removed"
585
589
]
586
590
},
587
591
"target": {
588
592
"type": "string",
589
593
"format": "at-uri"
590
594
},
591
595
"channel": {
592
596
"type": "string",
593
597
"format": "at-uri"
594
598
}
595
599
}
596
600
},
597
601
"communityEventData": {
598
602
"type": "object",
599
603
"required": [
600
604
"event",
601
605
"uri"
602
606
],
603
607
"properties": {
604
608
"uri": {
605
609
"type": "string",
606
610
"format": "at-uri"
607
611
},
608
612
"name": {
609
613
"type": "string"
610
614
},
611
615
"event": {
612
616
"type": "string",
613
617
"knownValues": [
614
618
"upsert",
615
619
"delete"
616
620
]
617
621
},
618
622
"banner": {
619
623
"type": "blob"
620
624
},
621
625
"picture": {
622
626
"type": "blob"
623
627
},
624
628
"description": {
625
629
"type": "string"
626
630
},
627
631
"categoryOrder": {
628
632
"type": "array",
629
633
"items": {
630
634
"type": "string",
631
635
"format": "at-uri"
632
636
}
633
637
},
634
638
"requiresApprovalToJoin": {
635
639
"type": "boolean"
636
640
}
637
641
}
638
642
},
639
643
"voicePresenceEvent": {
640
644
"type": "object",
641
645
"required": [
642
646
"type",
643
647
"data"
644
648
],
645
649
"properties": {
646
650
"data": {
647
651
"ref": "lex:social.colibri.sync.subscribeEvents#voicePresenceEventData",
648
652
"type": "ref"
649
653
},
650
654
"type": {
651
655
"type": "string",
652
656
"const": "voice_presence_event"
653
657
}
654
658
},
655
659
"description": "Sent when a user joins or leaves a voice channel."
656
660
},
657
661
"voiceStateEventData": {
658
662
"type": "object",
659
663
"required": [
660
664
"channel",
661
665
"did"
662
666
],
663
667
"properties": {
664
668
"did": {
665
669
"type": "string",
666
670
"format": "did"
667
671
},
668
672
"muted": {
669
673
"type": "boolean"
670
674
},
671
675
"channel": {
672
676
"type": "string",
673
677
"format": "at-uri"
674
678
},
675
679
"deafened": {
676
680
"type": "boolean"
677
681
},
678
682
"serverMuted": {
679
683
"type": "boolean"
680
684
},
681
685
"serverDeafened": {
682
686
"type": "boolean"
683
687
}
684
688
}
685
689
},
686
690
"voicePresenceEventData": {
687
691
"type": "object",
688
692
"required": [
689
693
"event",
690
694
"channel",
691
695
"did"
692
696
],
693
697
"properties": {
694
698
"did": {
695
699
"type": "string",
696
700
"format": "did"
697
701
},
698
702
"event": {
699
703
"type": "string",
700
704
"knownValues": [
701
705
"join",
702
706
"leave"
703
707
]
704
708
},
705
709
"channel": {
706
710
"type": "string",
707
711
"format": "at-uri"
708
712
}
709
713
}
710
714
}
711
715
},
712
716
"$type": "com.atproto.lexicon.schema",
713
717
"lexicon": 1,
714
718
"revision": 1
715
719
}