social.colibri.sync.subscribeEvents
Schema Diff
+2 -1
Compatibility Analysis
Backward Compatible
No changes detected.
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
},
435
436
"text": {
436
437
"type": "string"
437
438
},
438
439
"event": {
439
440
"type": "string",
440
441
"knownValues": [
441
442
"upsert",
442
443
"delete"
443
444
]
444
445
},
445
446
"edited": {
446
447
"type": "boolean"
447
448
},
448
449
"facets": {
449
450
"type": "array",
450
451
"items": {
451
452
"ref": "lex:social.colibri.richtext.facet",
452
453
"type": "ref"
453
454
}
454
455
},
455
456
"parent": {
456
457
"type": "string",
457
458
"format": "at-uri"
458
459
},
459
460
"channel": {
460
461
"type": "string",
461
462
"format": "at-uri"
462
463
},
463
464
"createdAt": {
464
465
"type": "string",
465
466
"format": "datetime"
466
467
},
467
468
"indexedAt": {
468
469
"type": "string",
469
470
"format": "datetime"
470
471
},
471
472
"attachments": {
472
473
"type": "array",
473
474
"items": {
474
475
"type": "blob"
475
476
}
476
477
}
477
478
}
478
479
},
479
480
"categoryEventData": {
480
481
"type": "object",
481
482
"required": [
482
483
"event",
483
484
"uri",
484
485
"community"
485
486
],
486
487
"properties": {
487
488
"uri": {
488
489
"type": "string",
489
490
"format": "at-uri"
490
491
},
491
492
"name": {
492
493
"type": "string"
493
494
},
494
495
"event": {
495
496
"type": "string",
496
497
"knownValues": [
497
498
"upsert",
498
499
"delete"
499
500
]
500
501
},
501
502
"community": {
502
503
"type": "string",
503
504
"format": "at-uri"
504
505
},
505
506
"channelOrder": {
506
507
"type": "array",
507
508
"items": {
508
509
"type": "string",
509
510
"format": "at-uri"
510
511
}
511
512
}
512
513
}
513
514
},
514
515
"memberEventMember": {
515
516
"type": "object",
516
517
"required": [
517
518
"did",
518
519
"handle",
519
520
"roles",
520
521
"data"
521
522
],
522
523
"properties": {
523
524
"vc": {
524
525
"type": "string",
525
526
"format": "at-uri",
526
527
"description": "AT-URI of the voice channel the member is currently connected to, if any. Only set when that channel belongs to `community`."
527
528
},
528
529
"did": {
529
530
"type": "string",
530
531
"format": "did"
531
532
},
532
533
"data": {
533
534
"ref": "lex:social.colibri.actor.defs#actorData",
534
535
"type": "ref"
535
536
},
536
537
"roles": {
537
538
"type": "array",
538
539
"items": {
539
540
"type": "string",
540
541
"format": "at-uri"
541
542
}
542
543
},
543
544
"handle": {
544
545
"type": "string",
545
546
"format": "handle"
546
547
},
547
548
"vcMuted": {
548
549
"type": "boolean"
549
550
},
550
551
"joinedAt": {
551
552
"type": "string",
552
553
"format": "datetime"
553
554
},
554
555
"nickname": {
555
556
"type": "string"
556
557
},
557
558
"vcDeafened": {
558
559
"type": "boolean"
559
560
}
560
561
},
561
562
"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
563
},
563
564
"reactionEventData": {
564
565
"type": "object",
565
566
"required": [
566
567
"event",
567
568
"uri",
568
569
"emoji",
569
570
"target",
570
571
"channel"
571
572
],
572
573
"properties": {
573
574
"uri": {
574
575
"type": "string",
575
576
"format": "at-uri"
576
577
},
577
578
"emoji": {
578
579
"type": "string"
579
580
},
580
581
"event": {
581
582
"type": "string",
582
583
"knownValues": [
583
584
"added",
584
585
"removed"
585
586
]
586
587
},
587
588
"target": {
588
589
"type": "string",
589
590
"format": "at-uri"
590
591
},
591
592
"channel": {
592
593
"type": "string",
593
594
"format": "at-uri"
594
595
}
595
596
}
596
597
},
597
598
"communityEventData": {
598
599
"type": "object",
599
600
"required": [
600
601
"event",
601
602
"uri"
602
603
],
603
604
"properties": {
604
605
"uri": {
605
606
"type": "string",
606
607
"format": "at-uri"
607
608
},
608
609
"name": {
609
610
"type": "string"
610
611
},
611
612
"event": {
612
613
"type": "string",
613
614
"knownValues": [
614
615
"upsert",
615
616
"delete"
616
617
]
617
618
},
618
619
"banner": {
619
620
"type": "blob"
620
621
},
621
622
"picture": {
622
623
"type": "blob"
623
624
},
624
625
"description": {
625
626
"type": "string"
626
627
},
627
628
"categoryOrder": {
628
629
"type": "array",
629
630
"items": {
630
631
"type": "string",
631
632
"format": "at-uri"
632
633
}
633
634
},
634
635
"requiresApprovalToJoin": {
635
636
"type": "boolean"
636
637
}
637
638
}
638
639
},
639
640
"voicePresenceEvent": {
640
641
"type": "object",
641
642
"required": [
642
643
"type",
643
644
"data"
644
645
],
645
646
"properties": {
646
647
"data": {
647
648
"ref": "lex:social.colibri.sync.subscribeEvents#voicePresenceEventData",
648
649
"type": "ref"
649
650
},
650
651
"type": {
651
652
"type": "string",
652
653
"const": "voice_presence_event"
653
654
}
654
655
},
655
656
"description": "Sent when a user joins or leaves a voice channel."
656
657
},
657
658
"voiceStateEventData": {
658
659
"type": "object",
659
660
"required": [
660
661
"channel",
661
662
"did"
662
663
],
663
664
"properties": {
664
665
"did": {
665
666
"type": "string",
666
667
"format": "did"
667
668
},
668
669
"muted": {
669
670
"type": "boolean"
670
671
},
671
672
"channel": {
672
673
"type": "string",
673
674
"format": "at-uri"
674
675
},
675
676
"deafened": {
676
677
"type": "boolean"
677
678
},
678
679
"serverMuted": {
679
680
"type": "boolean"
680
681
},
681
682
"serverDeafened": {
682
683
"type": "boolean"
683
684
}
684
685
}
685
686
},
686
687
"voicePresenceEventData": {
687
688
"type": "object",
688
689
"required": [
689
690
"event",
690
691
"channel",
691
692
"did"
692
693
],
693
694
"properties": {
694
695
"did": {
695
696
"type": "string",
696
697
"format": "did"
697
698
},
698
699
"event": {
699
700
"type": "string",
700
701
"knownValues": [
701
702
"join",
702
703
"leave"
703
704
]
704
705
},
705
706
"channel": {
706
707
"type": "string",
707
708
"format": "at-uri"
708
709
}
709
710
}
710
711
}
711
712
},
712
713
"$type": "com.atproto.lexicon.schema",
713
714
"lexicon": 1,
714
715
"revision": 1
715
716
}