Skip to content

SignalR Events

ContentLock uses a SignalR hub (ContentLockHub) mounted at /umbraco/ContentLockHub to push real-time updates to all connected backoffice clients. All events are defined in the IContentLockHubEvents interface.


EventWhen SentPayload
ReceiveLatestContentLocksWhen a client first connectsContentLockOverviewItem[] — full list of current locks
AddLockToClientsWhen any editor locks a nodeContentLockOverviewItem — the new lock
RemoveLockToClientsWhen a single node is unlockedGuid — the content key of the unlocked node
RemoveLocksToClientsWhen bulk unlock is performedGuid[] — the content keys of unlocked nodes
RemoveAllLocksToClientsE2E test cleanup only(no payload) — instructs all clients to clear all locks

EventWhen SentPayload
ReceiveListOfConnectedUsersWhen a client first connectsGuid[] — keys of all currently connected users
UserConnectedWhen a new editor connectsGuid — the new user’s key
UserDisconnectedWhen an editor disconnects (all tabs closed)Guid — the disconnected user’s key

A user is only marked as disconnected when all of their SignalR connections are closed. Opening the same backoffice in multiple tabs counts as multiple connections for the same user.


EventWhen SentPayload
ReceiveLatestOptionsOn client connect, or when appsettings.json changesContentLockOptions — the full current options object

This event powers the reactive configuration system — when an admin updates appsettings.json, the new settings are pushed to every connected client without a restart.


These events handle WebRTC signalling between peers (offer/answer/ICE) and call lifecycle notifications.

EventWhen SentPayload
ReceiveCallOfferSent to a specific user when another starts a callcallerKey: Guid, callerName: string, sdpOffer: string
ReceiveCallAnswerSent to the caller when the recipient acceptssdpAnswer: string
ReceiveIceCandidateRelayed between peers during connection setupcandidate: string, sdpMid: string?, sdpMLineIndex: int?
CallDeclinedSent to the caller when the recipient declines(no payload)
CallEndedSent to the remaining party when the other hangs up(no payload)
CallBusySent to the caller if the recipient is already in a call(no payload)
CallNoAnswerSent to the caller when the ring timeout expires(no payload)
MissedCallSent to the recipient when the ring timeout expirescallerKey: Guid, callerName: string
ConnectedUsersInCallUpdatedBroadcast to all clients when call participants changeGuid[] — keys of users currently in a call

PropertyValue
Hub classContentLockHub
Route/umbraco/ContentLockHub
Client trackingConcurrentDictionary<Guid, ConcurrentHashSet<string>> (user key → connection IDs)
AuthRequires Umbraco backoffice authentication