import type { ExtractMessageType } from '@colyseus/shared-types'; import type { Room } from '../Room.ts'; export type RoomMethodName = 'onCreate' | 'onAuth' | 'onJoin' | 'onLeave' | 'onDrop' | 'onReconnect' | 'onDispose' | 'onMessage' | 'setSimulationInterval' | 'setInterval' | 'setTimeout'; export type RoomException = OnCreateException | OnAuthException | OnJoinException | OnLeaveException | OnDropException | OnReconnectException | OnDisposeException | OnMessageException | SimulationIntervalException | TimedEventException; export class OnCreateException extends Error { options: Parameters[0]; constructor( cause: Error, message: string, options: Parameters[0], ) { super(message, { cause }); this.name = 'OnCreateException'; this.options = options; } } export class OnAuthException extends Error { client: Parameters[0]; options: Parameters[1]; constructor( cause: Error, message: string, client: Parameters[0], options: Parameters[1], ) { super(message, { cause }); this.name = 'OnAuthException'; this.client = client; this.options = options; } } export class OnJoinException extends Error { client: Parameters[0]; options: Parameters[1]; auth: Parameters[2]; constructor( cause: Error, message: string, client: Parameters[0], options: Parameters[1], auth: Parameters[2], ) { super(message, { cause }); this.name = 'OnJoinException'; this.client = client; this.options = options; this.auth = auth; } } export class OnLeaveException extends Error { client: Parameters[0]; consented: Parameters[1]; constructor( cause: Error, message: string, client: Parameters[0], consented: Parameters[1], ) { super(message, { cause }); this.name = 'OnLeaveException'; this.client = client; this.consented = consented; } } export class OnDropException extends Error { client: Parameters[0]; code: Parameters[1]; constructor( cause: Error, message: string, client: Parameters[0], code: Parameters[1], ) { super(message, { cause }); this.name = 'OnDropException'; this.client = client; this.code = code; } } export class OnReconnectException extends Error { client: Parameters[0]; constructor( cause: Error, message: string, client: Parameters[0], ) { super(message, { cause }); this.name = 'OnReconnectException'; this.client = client; } } export class OnDisposeException extends Error { constructor( cause: Error, message: string, ) { super(message, { cause }); this.name = 'OnDisposeException'; } } export class OnMessageException extends Error { client: R['~client']; payload: ExtractMessageType; type: MessageType; constructor( cause: Error, message: string, client: R['~client'], payload: ExtractMessageType, type: MessageType, ) { super(message, { cause }); this.name = 'OnMessageException'; this.client = client; this.payload = payload; this.type = type; } public isType(type: T): this is OnMessageException { return (this.type as string) === type; } } export class SimulationIntervalException extends Error { constructor( cause: Error, message: string, ) { super(message, { cause }); this.name = 'SimulationIntervalException'; } } export class TimedEventException extends Error { public args: any[]; constructor( cause: Error, message: string, ...args: any[] ) { super(message, { cause }); this.name = 'TimedEventException'; this.args = args; } }