import { BinaryWriter, BinaryReader } from '@bufbuild/protobuf/wire';

/** Defines message groups for which client can subscribe */
declare enum ServerMessage_EventType {
    EVENT_TYPE_UNSPECIFIED = 0,
    EVENT_TYPE_SERVER_NOTIFICATION = 1,
    EVENT_TYPE_METRICS = 2,
    UNRECOGNIZED = -1
}
/** Defines types of tracks being published by peers and component */
declare enum ServerMessage_TrackType {
    TRACK_TYPE_UNSPECIFIED = 0,
    TRACK_TYPE_VIDEO = 1,
    TRACK_TYPE_AUDIO = 2,
    UNRECOGNIZED = -1
}
/** Defines any type of message passed between FJ and server client */
interface ServerMessage {
    roomCrashed?: ServerMessage_RoomCrashed | undefined;
    peerConnected?: ServerMessage_PeerConnected | undefined;
    peerDisconnected?: ServerMessage_PeerDisconnected | undefined;
    peerCrashed?: ServerMessage_PeerCrashed | undefined;
    componentCrashed?: ServerMessage_ComponentCrashed | undefined;
    authenticated?: ServerMessage_Authenticated | undefined;
    authRequest?: ServerMessage_AuthRequest | undefined;
    subscribeRequest?: ServerMessage_SubscribeRequest | undefined;
    subscribeResponse?: ServerMessage_SubscribeResponse | undefined;
    roomCreated?: ServerMessage_RoomCreated | undefined;
    roomDeleted?: ServerMessage_RoomDeleted | undefined;
    metricsReport?: ServerMessage_MetricsReport | undefined;
    hlsPlayable?: ServerMessage_HlsPlayable | undefined;
    hlsUploaded?: ServerMessage_HlsUploaded | undefined;
    hlsUploadCrashed?: ServerMessage_HlsUploadCrashed | undefined;
    peerMetadataUpdated?: ServerMessage_PeerMetadataUpdated | undefined;
    trackAdded?: ServerMessage_TrackAdded | undefined;
    trackRemoved?: ServerMessage_TrackRemoved | undefined;
    trackMetadataUpdated?: ServerMessage_TrackMetadataUpdated | undefined;
    peerAdded?: ServerMessage_PeerAdded | undefined;
    peerDeleted?: ServerMessage_PeerDeleted | undefined;
}
declare const ServerMessage: MessageFns<ServerMessage>;
/** Notification sent when a room crashes */
interface ServerMessage_RoomCrashed {
    roomId: string;
}
declare const ServerMessage_RoomCrashed: MessageFns<ServerMessage_RoomCrashed>;
/** Notification sent when a peer is added */
interface ServerMessage_PeerAdded {
    roomId: string;
    peerId: string;
}
declare const ServerMessage_PeerAdded: MessageFns<ServerMessage_PeerAdded>;
/** Notification sent when a peer is removed */
interface ServerMessage_PeerDeleted {
    roomId: string;
    peerId: string;
}
declare const ServerMessage_PeerDeleted: MessageFns<ServerMessage_PeerDeleted>;
/** Notification sent when a peer connects */
interface ServerMessage_PeerConnected {
    roomId: string;
    peerId: string;
}
declare const ServerMessage_PeerConnected: MessageFns<ServerMessage_PeerConnected>;
/** Notification sent when a peer disconnects from FJ */
interface ServerMessage_PeerDisconnected {
    roomId: string;
    peerId: string;
}
declare const ServerMessage_PeerDisconnected: MessageFns<ServerMessage_PeerDisconnected>;
/** Notification sent when a peer crashes */
interface ServerMessage_PeerCrashed {
    roomId: string;
    peerId: string;
    reason: string;
}
declare const ServerMessage_PeerCrashed: MessageFns<ServerMessage_PeerCrashed>;
/** Notification sent when a component crashes */
interface ServerMessage_ComponentCrashed {
    roomId: string;
    componentId: string;
}
declare const ServerMessage_ComponentCrashed: MessageFns<ServerMessage_ComponentCrashed>;
/** Response sent by FJ, confirming successfull authentication */
interface ServerMessage_Authenticated {
}
declare const ServerMessage_Authenticated: MessageFns<ServerMessage_Authenticated>;
/** Request sent by client, to authenticate to FJ server */
interface ServerMessage_AuthRequest {
    token: string;
}
declare const ServerMessage_AuthRequest: MessageFns<ServerMessage_AuthRequest>;
/** Request sent by client to subsribe for certain message type */
interface ServerMessage_SubscribeRequest {
    eventType: ServerMessage_EventType;
}
declare const ServerMessage_SubscribeRequest: MessageFns<ServerMessage_SubscribeRequest>;
/** Response sent by FJ, confirming subscription for message type */
interface ServerMessage_SubscribeResponse {
    eventType: ServerMessage_EventType;
}
declare const ServerMessage_SubscribeResponse: MessageFns<ServerMessage_SubscribeResponse>;
/** Notification sent when a room is created */
interface ServerMessage_RoomCreated {
    roomId: string;
}
declare const ServerMessage_RoomCreated: MessageFns<ServerMessage_RoomCreated>;
/** Notification sent when a room is deleted */
interface ServerMessage_RoomDeleted {
    roomId: string;
}
declare const ServerMessage_RoomDeleted: MessageFns<ServerMessage_RoomDeleted>;
/** Message containing WebRTC metrics from FJ */
interface ServerMessage_MetricsReport {
    metrics: string;
}
declare const ServerMessage_MetricsReport: MessageFns<ServerMessage_MetricsReport>;
/** Notification sent when the HLS stream becomes available in a room */
interface ServerMessage_HlsPlayable {
    roomId: string;
    componentId: string;
}
declare const ServerMessage_HlsPlayable: MessageFns<ServerMessage_HlsPlayable>;
/** Notification sent when the HLS recording is successfully uploded to AWS S3 */
interface ServerMessage_HlsUploaded {
    roomId: string;
}
declare const ServerMessage_HlsUploaded: MessageFns<ServerMessage_HlsUploaded>;
/** Notification sent when the upload of HLS recording to AWS S3 fails */
interface ServerMessage_HlsUploadCrashed {
    roomId: string;
}
declare const ServerMessage_HlsUploadCrashed: MessageFns<ServerMessage_HlsUploadCrashed>;
/** Notification sent when peer updates its metadata */
interface ServerMessage_PeerMetadataUpdated {
    roomId: string;
    peerId: string;
    metadata: string;
}
declare const ServerMessage_PeerMetadataUpdated: MessageFns<ServerMessage_PeerMetadataUpdated>;
/** Describes a media track */
interface ServerMessage_Track {
    id: string;
    type: ServerMessage_TrackType;
    metadata: string;
}
declare const ServerMessage_Track: MessageFns<ServerMessage_Track>;
/** Notification sent when peer or component adds new track */
interface ServerMessage_TrackAdded {
    roomId: string;
    peerId?: string | undefined;
    componentId?: string | undefined;
    track: ServerMessage_Track | undefined;
}
declare const ServerMessage_TrackAdded: MessageFns<ServerMessage_TrackAdded>;
/** Notification sent when a track is removed */
interface ServerMessage_TrackRemoved {
    roomId: string;
    peerId?: string | undefined;
    componentId?: string | undefined;
    track: ServerMessage_Track | undefined;
}
declare const ServerMessage_TrackRemoved: MessageFns<ServerMessage_TrackRemoved>;
/** Notification sent when metadata of a multimedia track is updated */
interface ServerMessage_TrackMetadataUpdated {
    roomId: string;
    peerId?: string | undefined;
    componentId?: string | undefined;
    track: ServerMessage_Track | undefined;
}
declare const ServerMessage_TrackMetadataUpdated: MessageFns<ServerMessage_TrackMetadataUpdated>;
type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined;
type DeepPartial<T> = T extends Builtin ? T : T extends globalThis.Array<infer U> ? globalThis.Array<DeepPartial<U>> : T extends ReadonlyArray<infer U> ? ReadonlyArray<DeepPartial<U>> : T extends {} ? {
    [K in keyof T]?: DeepPartial<T[K]>;
} : Partial<T>;
type KeysOfUnion<T> = T extends T ? keyof T : never;
type Exact<P, I extends P> = P extends Builtin ? P : P & {
    [K in keyof P]: Exact<P[K], I[K]>;
} & {
    [K in Exclude<keyof I, KeysOfUnion<P>>]: never;
};
interface MessageFns<T> {
    encode(message: T, writer?: BinaryWriter): BinaryWriter;
    decode(input: BinaryReader | Uint8Array, length?: number): T;
    fromJSON(object: any): T;
    toJSON(message: T): unknown;
    create<I extends Exact<DeepPartial<T>, I>>(base?: I): T;
    fromPartial<I extends Exact<DeepPartial<T>, I>>(object: I): T;
}

export { ServerMessage, ServerMessage_AuthRequest, ServerMessage_EventType };
