{
"id": "social.colibri.sync.subscribeEvents",
"defs": {
"ack": {
"type": "object",
"required": [
"type"
],
"properties": {
"type": {
"type": "string",
"const": "ack"
}
},
"description": "Sent in response to a heartbeat message."
},
"main": {
"type": "subscription",
"errors": [
{
"name": "AuthRequired",
"description": "Missing, malformed, or unverifiable service auth."
}
],
"message": {
"schema": {
"refs": [
"lex:social.colibri.sync.subscribeEvents#ack",
"lex:social.colibri.sync.subscribeEvents#communityEvent",
"lex:social.colibri.sync.subscribeEvents#memberEvent",
"lex:social.colibri.sync.subscribeEvents#categoryEvent",
"lex:social.colibri.sync.subscribeEvents#channelEvent",
"lex:social.colibri.sync.subscribeEvents#messageEvent",
"lex:social.colibri.sync.subscribeEvents#reactionEvent",
"lex:social.colibri.sync.subscribeEvents#userEvent",
"lex:social.colibri.sync.subscribeEvents#typingEvent",
"lex:social.colibri.sync.subscribeEvents#voicePresenceEvent",
"lex:social.colibri.sync.subscribeEvents#voiceStateEvent"
],
"type": "union"
}
},
"description": "Opens a WebSocket stream that transmits relevant events for the authenticated user."
},
"userEvent": {
"type": "object",
"required": [
"type",
"data"
],
"properties": {
"data": {
"ref": "lex:social.colibri.sync.subscribeEvents#userEventData",
"type": "ref"
},
"type": {
"type": "string",
"const": "user_event"
}
},
"description": "Sent when a known user has updated their profile or Colibri status."
},
"userStatus": {
"type": "object",
"required": [
"state",
"text"
],
"properties": {
"text": {
"type": "string"
},
"emoji": {
"type": "string"
},
"state": {
"type": "string",
"knownValues": [
"online",
"away",
"dnd",
"offline"
]
}
}
},
"humEnvelope": {
"type": "object",
"required": [
"origin",
"id",
"ttl",
"subject",
"community",
"event"
],
"properties": {
"id": {
"type": "string",
"maxLength": 64,
"description": "Unique id for this Hum, used by receivers to dedup across relay paths."
},
"ttl": {
"type": "integer",
"maximum": 8,
"minimum": 0,
"description": "Remaining relay hops. Decremented on each forward; a Hum at ttl 0 is delivered locally but never relayed."
},
"event": {
"refs": [
"lex:social.colibri.sync.subscribeEvents#userEvent",
"lex:social.colibri.sync.subscribeEvents#typingEvent",
"lex:social.colibri.sync.subscribeEvents#voicePresenceEvent",
"lex:social.colibri.sync.subscribeEvents#voiceStateEvent"
],
"type": "union",
"description": "Ephemeral event payload. Only off-protocol types are permitted."
},
"origin": {
"type": "string",
"format": "did",
"description": "DID of the AppView that first emitted this Hum."
},
"subject": {
"type": "string",
"format": "did",
"description": "The user this event is about. Receiver MUST verify origin equals subject's declared presenceService before trusting or relaying."
},
"community": {
"type": "string",
"format": "at-uri",
"description": "Community the event is scoped to. Receiver relays to local clients only if they are members of this community."
}
},
"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."
},
"memberEvent": {
"type": "object",
"required": [
"type",
"data"
],
"properties": {
"data": {
"ref": "lex:social.colibri.sync.subscribeEvents#memberEventData",
"type": "ref"
},
"type": {
"type": "string",
"const": "member_event"
}
},
"description": "Sent when a member has joined or left a community."
},
"typingEvent": {
"type": "object",
"required": [
"type",
"data"
],
"properties": {
"data": {
"ref": "lex:social.colibri.sync.subscribeEvents#typingEventData",
"type": "ref"
},
"type": {
"type": "string",
"const": "typing_event"
}
},
"description": "Sent when a user is typing in a channel the client is viewing."
},
"userProfile": {
"type": "object",
"required": [
"handle"
],
"properties": {
"avatar": {
"type": "blob"
},
"banner": {
"type": "blob"
},
"handle": {
"type": "string",
"format": "handle"
},
"description": {
"type": "string"
},
"displayName": {
"type": "string"
}
}
},
"channelEvent": {
"type": "object",
"required": [
"type",
"data"
],
"properties": {
"data": {
"ref": "lex:social.colibri.sync.subscribeEvents#channelEventData",
"type": "ref"
},
"type": {
"type": "string",
"const": "channel_event"
}
},
"description": "Sent when a channel has been created, updated, or deleted."
},
"messageEvent": {
"type": "object",
"required": [
"type",
"data"
],
"properties": {
"data": {
"ref": "lex:social.colibri.sync.subscribeEvents#messageEventData",
"type": "ref"
},
"type": {
"type": "string",
"const": "message_event"
}
},
"description": "Sent when a message has been sent, edited, or deleted."
},
"categoryEvent": {
"type": "object",
"required": [
"type",
"data"
],
"properties": {
"data": {
"ref": "lex:social.colibri.sync.subscribeEvents#categoryEventData",
"type": "ref"
},
"type": {
"type": "string",
"const": "category_event"
}
},
"description": "Sent when a category has been created, updated, or deleted."
},
"reactionEvent": {
"type": "object",
"required": [
"type",
"data"
],
"properties": {
"data": {
"ref": "lex:social.colibri.sync.subscribeEvents#reactionEventData",
"type": "ref"
},
"type": {
"type": "string",
"const": "reaction_event"
}
},
"description": "Sent when a reaction has been added to or removed from a message."
},
"userEventData": {
"type": "object",
"required": [
"did",
"profile"
],
"properties": {
"did": {
"type": "string",
"format": "did"
},
"status": {
"ref": "lex:social.colibri.sync.subscribeEvents#userStatus",
"type": "ref"
},
"profile": {
"ref": "lex:social.colibri.sync.subscribeEvents#userProfile",
"type": "ref"
}
}
},
"communityEvent": {
"type": "object",
"required": [
"type",
"data"
],
"properties": {
"data": {
"ref": "lex:social.colibri.sync.subscribeEvents#communityEventData",
"type": "ref"
},
"type": {
"type": "string",
"const": "community_event"
}
},
"description": "Sent when a community has been updated or deleted."
},
"memberEventData": {
"type": "object",
"required": [
"event",
"community"
],
"properties": {
"event": {
"type": "string",
"knownValues": [
"join",
"leave",
"roles_updated"
]
},
"member": {
"ref": "lex:social.colibri.sync.subscribeEvents#memberEventMember",
"type": "ref",
"description": "The affected member, hydrated. Present on `join` and `roles_updated`."
},
"community": {
"type": "string",
"format": "at-uri"
},
"memberDid": {
"type": "string",
"format": "did",
"description": "DID of the member who left. Present on `leave`."
},
"membership": {
"type": "string",
"format": "at-uri"
}
}
},
"typingEventData": {
"type": "object",
"required": [
"event",
"channel",
"did"
],
"properties": {
"did": {
"type": "string",
"format": "did"
},
"event": {
"type": "string",
"knownValues": [
"start",
"stop"
]
},
"channel": {
"type": "string",
"format": "at-uri"
}
}
},
"voiceStateEvent": {
"type": "object",
"required": [
"type",
"data"
],
"properties": {
"data": {
"ref": "lex:social.colibri.sync.subscribeEvents#voiceStateEventData",
"type": "ref"
},
"type": {
"type": "string",
"const": "voice_state_event"
}
},
"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."
},
"channelEventData": {
"type": "object",
"required": [
"event",
"uri",
"community"
],
"properties": {
"uri": {
"type": "string",
"format": "at-uri"
},
"name": {
"type": "string"
},
"type": {
"type": "string"
},
"event": {
"type": "string",
"knownValues": [
"upsert",
"delete"
]
},
"category": {
"type": "string",
"format": "at-uri"
},
"community": {
"type": "string",
"format": "at-uri"
},
"description": {
"type": "string"
}
}
},
"messageEventData": {
"type": "object",
"required": [
"event",
"uri",
"channel"
],
"properties": {
"uri": {
"type": "string",
"format": "at-uri"
},
"text": {
"type": "string"
},
"event": {
"type": "string",
"knownValues": [
"upsert",
"delete"
]
},
"edited": {
"type": "boolean"
},
"facets": {
"type": "array",
"items": {
"ref": "lex:social.colibri.richtext.facet",
"type": "ref"
}
},
"parent": {
"type": "string",
"format": "at-uri"
},
"channel": {
"type": "string",
"format": "at-uri"
},
"createdAt": {
"type": "string",
"format": "datetime"
},
"indexedAt": {
"type": "string",
"format": "datetime"
},
"attachments": {
"type": "array",
"items": {
"type": "blob"
}
}
}
},
"categoryEventData": {
"type": "object",
"required": [
"event",
"uri",
"community"
],
"properties": {
"uri": {
"type": "string",
"format": "at-uri"
},
"name": {
"type": "string"
},
"event": {
"type": "string",
"knownValues": [
"upsert",
"delete"
]
},
"community": {
"type": "string",
"format": "at-uri"
},
"channelOrder": {
"type": "array",
"items": {
"type": "string",
"format": "at-uri"
}
}
}
},
"memberEventMember": {
"type": "object",
"required": [
"did",
"handle",
"roles",
"data"
],
"properties": {
"vc": {
"type": "string",
"format": "at-uri",
"description": "AT-URI of the voice channel the member is currently connected to, if any. Only set when that channel belongs to `community`."
},
"did": {
"type": "string",
"format": "did"
},
"data": {
"ref": "lex:social.colibri.actor.defs#actorData",
"type": "ref"
},
"roles": {
"type": "array",
"items": {
"type": "string",
"format": "at-uri"
}
},
"handle": {
"type": "string",
"format": "handle"
},
"vcMuted": {
"type": "boolean"
},
"joinedAt": {
"type": "string",
"format": "datetime"
},
"nickname": {
"type": "string"
},
"vcDeafened": {
"type": "boolean"
}
},
"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."
},
"reactionEventData": {
"type": "object",
"required": [
"event",
"uri",
"emoji",
"target",
"channel"
],
"properties": {
"uri": {
"type": "string",
"format": "at-uri"
},
"emoji": {
"type": "string"
},
"event": {
"type": "string",
"knownValues": [
"added",
"removed"
]
},
"target": {
"type": "string",
"format": "at-uri"
},
"channel": {
"type": "string",
"format": "at-uri"
}
}
},
"communityEventData": {
"type": "object",
"required": [
"event",
"uri"
],
"properties": {
"uri": {
"type": "string",
"format": "at-uri"
},
"name": {
"type": "string"
},
"event": {
"type": "string",
"knownValues": [
"upsert",
"delete"
]
},
"banner": {
"type": "blob"
},
"picture": {
"type": "blob"
},
"description": {
"type": "string"
},
"categoryOrder": {
"type": "array",
"items": {
"type": "string",
"format": "at-uri"
}
},
"requiresApprovalToJoin": {
"type": "boolean"
}
}
},
"voicePresenceEvent": {
"type": "object",
"required": [
"type",
"data"
],
"properties": {
"data": {
"ref": "lex:social.colibri.sync.subscribeEvents#voicePresenceEventData",
"type": "ref"
},
"type": {
"type": "string",
"const": "voice_presence_event"
}
},
"description": "Sent when a user joins or leaves a voice channel."
},
"voiceStateEventData": {
"type": "object",
"required": [
"channel",
"did"
],
"properties": {
"did": {
"type": "string",
"format": "did"
},
"muted": {
"type": "boolean"
},
"channel": {
"type": "string",
"format": "at-uri"
},
"deafened": {
"type": "boolean"
},
"serverMuted": {
"type": "boolean"
},
"serverDeafened": {
"type": "boolean"
}
}
},
"voicePresenceEventData": {
"type": "object",
"required": [
"event",
"channel",
"did"
],
"properties": {
"did": {
"type": "string",
"format": "did"
},
"event": {
"type": "string",
"knownValues": [
"join",
"leave"
]
},
"channel": {
"type": "string",
"format": "at-uri"
}
}
}
},
"$type": "com.atproto.lexicon.schema",
"lexicon": 1,
"revision": 1
}