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