UNPKG

@game-vir/multiplayer

Version:

Client side definitions and types for @game-vir/multiplayer-server

91 lines (90 loc) 2.95 kB
import { AnyOrigin, defineService, HttpMethod } from '@rest-vir/define-service'; import { defineShape, exact, indexedKeys, or, tupleShape, uuidShape } from 'object-shape-tester'; import { buildUrl } from 'url-vir'; import { answerMessageShape, errorMessageShape, forwardedOfferMessageShape, hostPingMessageShape, offerMessageShape, offerResultShape, } from './multiplayer-socket-messages.js'; /** * Shape definition for {@link MultiplayerClientRoom}. * * @category Internal */ export const multiplayerClientRoomShape = defineShape({ roomName: '', roomId: uuidShape, clientCount: -1, hasRoomPassword: false, }); /** * Shape definition for {@link MultiplayerClientRooms}. * * @category Internal */ export const multiplayerClientRoomsShape = defineShape(indexedKeys({ keys: uuidShape, values: multiplayerClientRoomShape, required: false, })); /** * The default, or starting, port for the multiplayer service. * * @category Internal */ export const defaultMultiplayerServicePort = 3500; /** * The default multiplayer service origin. * * @category Internal */ export const defaultMultiplayerServiceOrigin = buildUrl('http://localhost', { port: defaultMultiplayerServicePort, }).origin; /** * The multiplayer service definition. * * @category Internal */ export function defineMultiplayerService(backendOrigin = defaultMultiplayerServiceOrigin) { return defineService({ serviceName: 'multiplayer-service', requiredClientOrigin: AnyOrigin, serviceOrigin: backendOrigin, endpoints: { /** Same as health. */ '/': { methods: { [HttpMethod.Get]: true, }, requestDataShape: undefined, responseDataShape: exact('ok'), requiredClientOrigin: AnyOrigin, }, '/health': { methods: { [HttpMethod.Get]: true, }, requestDataShape: undefined, responseDataShape: exact('ok'), requiredClientOrigin: AnyOrigin, }, /** List all current public rooms. */ '/rooms': { requestDataShape: undefined, responseDataShape: multiplayerClientRoomsShape, methods: { [HttpMethod.Get]: true, }, searchParamsShape: { gameId: tupleShape(''), }, }, }, webSockets: { '/connect': { messageFromClientShape: or(answerMessageShape, offerMessageShape, hostPingMessageShape), messageFromHostShape: or(answerMessageShape, forwardedOfferMessageShape, offerResultShape, errorMessageShape), searchParamsShape: { gameId: tupleShape(''), }, }, }, }); }