import type { WrpcRoomBroadcast, WrpcRoomBroadcasts } from "./wrpcRoomBroadcast"; import type { WrpcRoomCommand, WrpcRoomCommands } from "./wrpcRoomCommand"; import type { WrpcRoomConnectionMetadata } from "./wrpcRoomConnectionMetadata"; import type { WrpcRoomErrors } from "./wrpcRoomError"; import type { WrpcRoomEvent, WrpcRoomEvents } from "./wrpcRoomEvent"; import type { WrpcRoomLifecycles } from "./wrpcRoomLifecycle"; import type { WrpcRoomMetadata } from "./wrpcRoomMetadata"; import type { WrpcRoomConfig, WrpcRoomSettings } from "./wrpcRoomSettings"; import type { WrpcRoomState } from "./wrpcRoomState"; import type { InferShapeOutput, Maybe, Shape } from "./wrpcSchema"; export type WrpcRoomData< State extends Maybe = unknown, Metadata extends Maybe = unknown, ConnectionMetadata extends Maybe = unknown, Errors extends Maybe>> = unknown, Create extends Maybe = unknown, Join extends Maybe = unknown, Broadcasts extends Maybe> = unknown, Events extends Maybe> = unknown, Commands extends Maybe> = unknown, > = WrpcRoomSettings & WrpcRoomState & WrpcRoomMetadata & WrpcRoomConnectionMetadata & WrpcRoomErrors & WrpcRoomLifecycles & WrpcRoomBroadcasts & WrpcRoomEvents & WrpcRoomCommands; export type WrpcRoomDefinition< State extends Maybe = unknown, Metadata extends Maybe = unknown, ConnectionMetadata extends Maybe = unknown, Errors extends Maybe>> = unknown, Create extends Maybe = unknown, Join extends Maybe = unknown, Broadcasts extends Maybe> = unknown, Events extends Maybe> = unknown, Commands extends Maybe> = unknown, > = { config?: WrpcRoomConfig; state: State extends Shape ? State : undefined; initialState: InferShapeOutput; metadata: Metadata extends Shape ? Metadata : undefined; initialMetadata: InferShapeOutput; connectionMetadata: ConnectionMetadata extends Shape ? ConnectionMetadata : undefined; initialConnectionMetadata: InferShapeOutput; errors: Errors extends Record> ? Errors : Record>; create: Create extends Shape ? Create : undefined; join: Join extends Shape ? Join : undefined; broadcasts: Broadcasts extends Record ? Broadcasts : Record; events: Events extends Record ? Events : Record; commands: Commands extends Record ? Commands : Record; }; export type WrpcRoom< State extends Maybe = unknown, Metadata extends Maybe = unknown, ConnectionMetadata extends Maybe = unknown, Errors extends Maybe>> = unknown, Create extends Maybe = unknown, Join extends Maybe = unknown, Broadcasts extends Maybe> = unknown, Events extends Maybe> = unknown, Commands extends Maybe> = unknown, WrpcRoomBase extends Maybe = unknown, > = WrpcRoomDefinition & { wrpcRoomBase?: WrpcRoomBase; extend: < NewState extends Maybe = State, NewRoomMetadata extends Maybe = unknown, NewConnectionMetadata extends Maybe = unknown, NewErrors extends Maybe>> = unknown, NewCreate extends Maybe = unknown, NewJoin extends Maybe = unknown, NewBroadcasts extends Maybe> = unknown, NewEvents extends Maybe> = unknown, NewCommands extends Maybe> = unknown, >( extender: ( wrpcRoomBase: WrpcRoomDefinition< State, Metadata, ConnectionMetadata, Errors, Create, Join, Broadcasts, Events, Commands >, ) => WrpcRoomData< NewState, NewRoomMetadata, NewConnectionMetadata, NewErrors, NewCreate, NewJoin, NewBroadcasts, NewEvents, NewCommands >, ) => WrpcRoom< NewState, NewRoomMetadata, NewConnectionMetadata, NewErrors, NewCreate, NewJoin, NewBroadcasts, NewEvents, NewCommands, WrpcRoom >; }; export const defineWrpcRoom = < State extends Maybe = unknown, Metadata extends Maybe = unknown, ConnectionMetadata extends Maybe = unknown, Errors extends Maybe>> = unknown, Create extends Maybe = unknown, Join extends Maybe = unknown, Broadcasts extends Maybe> = unknown, Events extends Maybe> = unknown, Commands extends Maybe> = unknown, WrpcRoomBase extends Maybe = unknown, >( wrpcRoomData: WrpcRoomData, wrpcRoomBase?: WrpcRoomBase, ): WrpcRoom => ({ config: wrpcRoomData.config, state: wrpcRoomData.state as State extends Shape ? State : undefined, initialState: wrpcRoomData.initialState as InferShapeOutput, metadata: wrpcRoomData.metadata as Metadata extends Shape ? Metadata : undefined, initialMetadata: wrpcRoomData.initialMetadata as InferShapeOutput, connectionMetadata: wrpcRoomData.connectionMetadata as ConnectionMetadata extends Shape ? ConnectionMetadata : undefined, initialConnectionMetadata: wrpcRoomData.initialConnectionMetadata as InferShapeOutput, errors: (wrpcRoomData.errors ?? {}) as Errors extends Record> ? Errors : Record>, create: wrpcRoomData.create as Create extends Shape ? Create : undefined, join: wrpcRoomData.join as Join extends Shape ? Join : undefined, broadcasts: (wrpcRoomData.broadcasts ?? {}) as Broadcasts extends Record ? Broadcasts : Record, events: (wrpcRoomData.events ?? {}) as Events extends Record ? Events : Record, commands: (wrpcRoomData.commands ?? {}) as Commands extends Record ? Commands : Record, wrpcRoomBase, extend: < NewState extends Maybe = State, NewMetadata extends Maybe = unknown, NewConnectionMetadata extends Maybe = unknown, NewErrors extends Maybe>> = unknown, NewCreate extends Maybe = unknown, NewJoin extends Maybe = unknown, NewBroadcasts extends Maybe> = unknown, NewEvents extends Maybe> = unknown, NewCommands extends Maybe> = unknown, >( extender: ( wrpcRoomBase: WrpcRoomDefinition< State, Metadata, ConnectionMetadata, Errors, Create, Join, Broadcasts, Events, Commands >, ) => WrpcRoomData< NewState, NewMetadata, NewConnectionMetadata, NewErrors, NewCreate, NewJoin, NewBroadcasts, NewEvents, NewCommands >, ) => { const nextWrpcRoomData = extender({ config: wrpcRoomData.config, state: wrpcRoomData.state as State extends Shape ? State : undefined, initialState: wrpcRoomData.initialState as InferShapeOutput, metadata: wrpcRoomData.metadata as Metadata extends Shape ? Metadata : undefined, initialMetadata: wrpcRoomData.initialMetadata as InferShapeOutput, connectionMetadata: wrpcRoomData.connectionMetadata as ConnectionMetadata extends Shape ? ConnectionMetadata : undefined, initialConnectionMetadata: wrpcRoomData.initialConnectionMetadata as InferShapeOutput< ConnectionMetadata, undefined >, errors: (wrpcRoomData.errors ?? {}) as Errors extends Record> ? Errors : Record>, create: wrpcRoomData.create as Create extends Shape ? Create : undefined, join: wrpcRoomData.join as Join extends Shape ? Join : undefined, broadcasts: (wrpcRoomData.broadcasts ?? {}) as Broadcasts extends Record ? Broadcasts : Record, events: (wrpcRoomData.events ?? {}) as Events extends Record ? Events : Record, commands: (wrpcRoomData.commands ?? {}) as Commands extends Record ? Commands : Record, }); return defineWrpcRoom(nextWrpcRoomData, wrpcRoomBase) as WrpcRoom< NewState, NewMetadata, NewConnectionMetadata, NewErrors, NewCreate, NewJoin, NewBroadcasts, NewEvents, NewCommands, WrpcRoom >; }, });