@game-vir/multiplayer
Version:
Client side definitions and types for @game-vir/multiplayer-server
91 lines (90 loc) • 2.95 kB
JavaScript
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(''),
},
},
},
});
}