Raven Docs

Event Catalogue

Every event Raven emits — RTC room events, chat events, and webhooks — verified against the SDK source.

Raven has two separate event surfaces, and they don't overlap:

  • RTC and chat client events fire inside your app, in the SDK you're already holding — room.on(...) and chat.on(...). No webhook involved; these exist as long as your client is connected.
  • Webhooks are server-to-server, for reacting to activity from your backend rather than a browser tab. See Webhooks for the envelope, signing, and retry behavior — this page only catalogues which events exist.

RTC — room.on(...)

Every RTC event, from @corvidhq/rtc's RoomEventMap. Identical across @corvidhq/rtc, @corvidhq/react (as useRoomEvent), and @corvidhq/react-native — same events, same payloads.

EventPayloadFires when
connectionStateChangedstate: ConnectionStateThe room's connection state changes — see Reconnection.
connectedThe room finished joining.
disconnectedThe room disconnected, deliberately or not.
reconnectingA dropped connection is being re-established automatically.
reconnectedReconnection succeeded; tracks resume without rejoining.
participantJoinedparticipant: RemoteParticipantSomeone else joins the room.
participantLeftparticipant: RemoteParticipantSomeone else leaves the room.
trackPublishedkind, participantA remote participant starts publishing a track (before you're necessarily subscribed to it).
trackUnpublishedkind, participantA remote participant stops publishing a track.
trackSubscribedtrack: RemoteTrack, participantA remote track becomes available to render/play locally.
trackUnsubscribedtrack: RemoteTrack, participantA subscribed remote track is no longer available.
trackMutedkind, participantA remote participant mutes a track they already published — see Muting vs. unpublishing.
trackUnmutedkind, participantA remote participant unmutes a track.
localTrackPublishedtrack: LocalTrackYour own enableCamera()/enableMicrophone()/publish() finished publishing.
localTrackUnpublishedtrack: LocalTrackYour own track stops publishing.
dataReceivedpayload: Uint8Array, participant?A data message arrives — see Overview → Data messages.
errorerror: RTCErrorSomething failed with a typed, catchable error rather than an unhandled rejection.
room.on('participantJoined', (participant) => {
  console.log(`${participant.identity} joined`);
});
 
room.on('trackSubscribed', (track, participant) => {
  videoElement.srcObject = track.mediaStream;
});

Two things this list does not include, because the SDK doesn't emit them as discrete events: live per-participant connection-quality updates (poll room.getConnectionStats() instead), and reconnect attempt count (available via getDiagnostics().reconnectCount, not an event).

Chat — chat.on(...)

Every chat event, from @corvidhq/chat's ChatEventMap.

EventPayloadFires when
messagemessage: ChatMessageA message arrives — including your own, echoed back with its canonical id. See Messages.
messageUpdatedmessage: ChatMessageA message is edited.
messageDeletedevent: MessageDeletedEventA message is soft-deleted.
reactionAddedevent: ReactionEventSomeone reacts to a message — see Reactions.
reactionRemovedevent: ReactionEventA reaction is removed.
typingevent: TypingEventA participant's typing state changes — see Typing Indicators.
presenceevent: PresenceEventA participant's online/offline state changes — see Presence.
readevent: ReadReceiptEventA read-receipt position advances — see Delivery & Read Receipts.
connectionStateChangedstate: ChatConnectionStateThe chat WebSocket's connection state changes.
connectedchat.connect() finished.
disconnectedThe chat connection dropped, deliberately or not.
reconnectingattempt: numberAn automatic reconnect is in progress.
reconnectedReconnection succeeded.
errorerror: RavenChatErrorA typed, catchable chat error — see Errors.
chat.on('message', (message) => console.log(`${message.senderId}: ${message.text}`));
chat.on('typing', (event) => showTypingIndicator(event.userId, event.isTyping));

These map directly onto the WebSocket protocol's server frames — chat.on(...) is the decoded, typed form of the same events the wire protocol carries.

Webhooks

Delivered server-to-server through the webhook pipeline — see Webhooks for the envelope, signing, and retries. The pipeline is project-scoped rather than chat-specific, so it's the same mechanism a future RTC or billing event would publish through, not a second one.

EventPayloadFires when
message.created{ message }A chat message is stored.
message.updated{ message }A chat message is edited.
message.deleted{ messageId, roomId, ... }A chat message is soft-deleted.
reaction.added{ messageId, roomId, userId, emoji, at }A reaction is added to a message.
reaction.removed{ messageId, roomId, userId, emoji, at }A reaction is removed from a message.
room.created{ roomId, name, type, rtcRoomId?, rtcRoomName?, createdAt }A conversation is created — roomId here is the conversation's public id, not an RTC room.
participant.joined{ roomId, userId, role, at }A member joins a conversation.
participant.left{ roomId, userId, role, at }A member leaves a conversation.

Subscribe to specific events, or leave the list empty to receive everything currently emitted; a future addition to this list is additive, and an existing subscription with an empty filter picks it up automatically.

What isn't emitted as a webhook

RTC room lifecycle (room.started/room.ended), track events, connection state changes, and presence are real-time client events only (see the tables above) — they are not currently delivered as webhooks, because nothing server-side needs to react to them on the timescale a webhook implies. If your integration needs one as a server-side signal, the equivalent data is generally available by polling the relevant REST endpoint — see REST API — or, for RTC connection data specifically, via Diagnostics.