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