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