Skip to main content

Disconnect Events

When your client fails to connect to a room or gets disconnected, it can be useful to know why. Starting in Normcore v2.16.0, Realtime has a new C# event called didDisconnectFromRoomWithEvent(Realtime realtime, DisconnectEvent disconnectEvent), and Room has a disconnectEvent property that stores the last disconnect event.

Whenever Normcore fails to connect or an active connection is disconnected, the didDisconnectFromRoomWithEvent event fires. This event includes a DisconnectEvent object with information about the disconnection.

All events are subclasses of the DisconnectEvent class. The DisconnectEvent class guarantees that all events will have basic properties like a human-readable message, while the subclasses provide more specific metadata for each type of disconnect.

Handling Disconnect Events​

When your client is disconnected from a room, you can use the didDisconnectFromRoomWithEvent event to be notified and use C# pattern matching to determine the specific type of disconnect event:

public class DisconnectHandler : MonoBehaviour {
private Realtime _realtime;

void Awake() {
_realtime = GetComponent<Realtime>();
}

void OnEnable() {
_realtime.didDisconnectFromRoomWithEvent += DidDisconnect;
}

void OnDisable() {
_realtime.didDisconnectFromRoomWithEvent -= DidDisconnect;
}

void DidDisconnect(Realtime realtime, DisconnectEvent disconnectEvent) {
// Display an error using the human readable message
DisplayError("Disconnected", disconnectEvent.message);

// Log the full event for debugging
Debug.Log(disconnectEvent.ToString());

// Narrow down the type and handle the specific disconnect event
if (disconnectEvent is DeviceIdleTimeout deviceIdleTimeout) {
// The app was backgrounded until the connection timed out. Let's reconnect.
_realtime.Connect(disconnectEvent.roomName, disconnectEvent.connectOptions);
}
}
}

DisconnectEvent class​

All events are subclasses of the DisconnectEvent class. The DisconnectEvent class guarantees that all events will have basic properties like a human-readable message, while the subclasses provide more specific metadata for each type of disconnect.

The DisconnectEvent class contains the following properties and methods:

  • roomName: The name of the room from which the client was disconnected. You can use this to reconnect to the same room.
  • connectOptions: A copy of the ConnectOptions struct that was used to connect to the room.
  • message: A human-readable message that can be safely displayed to your users.
  • ToString(): A non-human-readable representation of the event, useful for debugging or for getting support from the Normcore team.

DisconnectEvent subclasses​

Here is a list of all DisconnectEvent subclasses, along with a brief description of each and any properties specific to that subclass:

NativePluginVersionMismatch​

Occurs when the Normcore native plugin version doesn't match the Unity package version.

RoomNameEmpty​

Triggered when attempting to connect to a room with an empty room name.

RoomNameInvalidLength​

Occurs when a room name exceeds 512 characters.

  • length: The length of the room name supplied.

AppKeyEmpty​

Triggered when attempting to connect with an empty app key.

FailedToConnectToServer​

Occurs when the client fails to connect to the server for various reasons during the initial connection. This class serves as a base class for all events that occur during the initial connection process.

InitialDatastoreDeserializationFailed​

Occurs when the client fails to deserialize the initial room state data.

  • analysis: A string containing a detailed analysis of the datastore buffer that failed to deserialize.

DisconnectCalledByLocalClient​

Triggered when the local client explicitly calls disconnect.

DeviceIdleTimeout​

Occurs when the client hasn't processed incoming packets for more than 60 seconds.

ConnectionFailedWithNetworkError​

Network failure error that occurs during an active connection.

DatastoreDeserializationFailed​

Occurs when the client fails to deserialize an incoming room state update.

  • analysis: A string containing a detailed analysis of the datastore buffer that failed to deserialize.

AppDisabled​

Triggered when attempting to connect with an app key that has been disabled.

  • reason: A string containing the reason the app was disabled. Most commonly, this occurs when the app has hit its monthly usage limit.

AppPaused​

Occurs when attempting to connect with an app key that has been paused in the dashboard.

AppInvalidEntitlement​

Triggered when attempting to use a feature (like WebGL or custom room configurations) without the required plan.

  • appKey: The app key that was used to connect.
  • feature: The feature that the app is not entitled to use.
  • reason: The reason the backend rejected the connection request.

RoomServerOptionsInvalid​

Occurs when the provided room server configuration options are invalid. Most commonly, this is due to an invalid room server configuration name.

  • validationErrors: A ReadonlyList<ValidationError> of validation errors that occurred when parsing the room server options object:
    • field: The field that was invalid.
    • error: The error message that occurred when parsing the field.

AppNotFound​

Triggered when attempting to connect with an app key that doesn't exist.

RateLimit​

Occurs when too many requests are made in a short time period.

WebhookRejectedRequest​

Triggered when a configured webhook rejects the connection request.

  • webhookErrorMessage: A string containing the error message that was returned by the webhook.
  • webhookErrorContext: A string containing the context object returned by the webhook.

InternalServerError​

Occurs when there's an unexpected error on the server side.

  • details: A string containing the specific details of the internal server error.

BadRequest​

Triggered when the client sends an invalid request to the server. In practice, this should be impossible to hit.

  • reason: A string containing the reason the backend rejected the connection request.

LegacyMatcherError​

Occurs when a newer client connects to an older Normcore backend using the v1 error format.

UnknownMatcherError​

Triggered when an older client receives a new error type it doesn't recognize.

  • errorCode; A string containing the error code that was returned by the server.