import type { Patch } from "immer"; import type { WrpcErrorCode } from "./wrpcError"; import type { WrpcRoomConfig } from "./wrpcRoomSettings"; export enum WrpcMessageType { Config = "config", State = "state", Metadata = "metadata", ConnectionMetadata = "connectionMetadata", Create = "create", Join = "join", Host = "host", Leave = "leave", Broadcast = "broadcast", Event = "event", Command = "command", Removed = "removed", Error = "error", } export type WrpcMessageConfig = WrpcMessageRoom & { type: WrpcMessageType.Config; config: WrpcRoomConfig; }; export type WrpcMessageState = WrpcMessageRoom & { type: WrpcMessageType.State; patches?: Patch[]; }; export type WrpcMessageMetadata = WrpcMessageRoom & { type: WrpcMessageType.Metadata; patches?: Patch[]; }; export type WrpcMessageConnectionMetadata = WrpcMessageRoom & { type: WrpcMessageType.ConnectionMetadata; patches?: Patch[]; }; export type WrpcMessageRequest = { requestId: number; }; export type WrpcMessageRoom = { roomId: string; }; export type WrpcMessageCreateRequest = WrpcMessageRequest & { type: WrpcMessageType.Create; name: string; input: unknown; }; export type WrpcMessageCreateResponse = WrpcMessageRoom & WrpcMessageRequest & { type: WrpcMessageType.Create; }; export type WrpcMessageCreate = WrpcMessageCreateRequest | WrpcMessageCreateResponse; export type WrpcMessageJoinRequest = WrpcMessageRoom & WrpcMessageRequest & { type: WrpcMessageType.Join; input: unknown; }; export type WrpcMessageJoinResponse = WrpcMessageRoom & WrpcMessageRequest & { type: WrpcMessageType.Join; config: WrpcRoomConfig; state: unknown; metadata: unknown; connectionMetadata: unknown; }; export type WrpcMessageJoin = WrpcMessageJoinRequest | WrpcMessageJoinResponse; export type WrpcMessageHostRequest = WrpcMessageRequest & { type: WrpcMessageType.Host; name: string; createInput: unknown; joinInput: unknown; }; export type WrpcMessageHostResponse = WrpcMessageRoom & WrpcMessageRequest & { type: WrpcMessageType.Host; config: WrpcRoomConfig; state: unknown; metadata: unknown; connectionMetadata: unknown; }; export type WrpcMessageHost = WrpcMessageHostRequest | WrpcMessageHostResponse; export type WrpcMessageLeaveRequest = WrpcMessageRoom & WrpcMessageRequest & { type: WrpcMessageType.Leave; }; export type WrpcMessageLeaveResponse = WrpcMessageRoom & WrpcMessageRequest & { type: WrpcMessageType.Leave; }; export type WrpcMessageLeave = WrpcMessageLeaveRequest | WrpcMessageLeaveResponse; export type WrpcMessageBroadcast = WrpcMessageRoom & { type: WrpcMessageType.Broadcast; name: string; input: unknown; }; export type WrpcMessageEvent = WrpcMessageRoom & { type: WrpcMessageType.Event; name: string; input: unknown; }; export type WrpcMessageCommandRequest = WrpcMessageRoom & WrpcMessageRequest & { type: WrpcMessageType.Command; name: string; input: unknown; }; export type WrpcMessageCommandResponse = WrpcMessageRoom & WrpcMessageRequest & { type: WrpcMessageType.Command; name: string; output: unknown; }; export type WrpcMessageRemoved = WrpcMessageRoom & { type: WrpcMessageType.Removed; }; export type WrpcMessageError = Partial & { type: WrpcMessageType.Error; code: WrpcErrorCode; defined?: boolean; message?: string; data?: unknown; }; export type WrpcMessageClientRoom = WrpcMessageEvent | WrpcMessageCommandRequest; export type WrpcMessageServerRoom = | WrpcMessageConfig | WrpcMessageState | WrpcMessageMetadata | WrpcMessageConnectionMetadata | WrpcMessageBroadcast | WrpcMessageRemoved; export type WrpcMessageClient = | WrpcMessageCreateRequest | WrpcMessageJoinRequest | WrpcMessageHostRequest | WrpcMessageLeaveRequest | WrpcMessageClientRoom; export type WrpcMessageServer = | WrpcMessageCreateResponse | WrpcMessageJoinResponse | WrpcMessageHostResponse | WrpcMessageLeaveResponse | WrpcMessageCommandResponse | WrpcMessageServerRoom | WrpcMessageError; export type WrpcMessage = WrpcMessageClient | WrpcMessageServer;