gameon-sdk 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. package/dist/client.d.ts +116 -0
  2. package/dist/client.d.ts.map +1 -0
  3. package/dist/client.js +251 -0
  4. package/dist/client.js.map +1 -0
  5. package/dist/index.d.ts +2 -3
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +2 -5
  8. package/dist/index.js.map +1 -1
  9. package/dist/server.cjs +193 -0
  10. package/dist/server.d.ts +101 -0
  11. package/dist/server.d.ts.map +1 -0
  12. package/dist/server.js +169 -0
  13. package/dist/server.js.map +1 -0
  14. package/dist/types.d.ts +93 -0
  15. package/dist/types.d.ts.map +1 -0
  16. package/dist/types.js +4 -0
  17. package/dist/types.js.map +1 -0
  18. package/package.json +23 -15
  19. package/dist/apis/DefaultApi.d.ts +0 -308
  20. package/dist/apis/DefaultApi.d.ts.map +0 -1
  21. package/dist/apis/DefaultApi.js +0 -569
  22. package/dist/apis/DefaultApi.js.map +0 -1
  23. package/dist/apis/index.d.ts +0 -2
  24. package/dist/apis/index.d.ts.map +0 -1
  25. package/dist/apis/index.js +0 -4
  26. package/dist/apis/index.js.map +0 -1
  27. package/dist/models/BetCurrency.d.ts +0 -27
  28. package/dist/models/BetCurrency.d.ts.map +0 -1
  29. package/dist/models/BetCurrency.js +0 -45
  30. package/dist/models/BetCurrency.js.map +0 -1
  31. package/dist/models/BetInput.d.ts +0 -35
  32. package/dist/models/BetInput.d.ts.map +0 -1
  33. package/dist/models/BetInput.js +0 -48
  34. package/dist/models/BetInput.js.map +0 -1
  35. package/dist/models/BetRecord.d.ts +0 -86
  36. package/dist/models/BetRecord.d.ts.map +0 -1
  37. package/dist/models/BetRecord.js +0 -81
  38. package/dist/models/BetRecord.js.map +0 -1
  39. package/dist/models/BiggestWin.d.ts +0 -60
  40. package/dist/models/BiggestWin.d.ts.map +0 -1
  41. package/dist/models/BiggestWin.js +0 -58
  42. package/dist/models/BiggestWin.js.map +0 -1
  43. package/dist/models/Colour.d.ts +0 -27
  44. package/dist/models/Colour.d.ts.map +0 -1
  45. package/dist/models/Colour.js +0 -45
  46. package/dist/models/Colour.js.map +0 -1
  47. package/dist/models/CreateRoomV2Request.d.ts +0 -37
  48. package/dist/models/CreateRoomV2Request.d.ts.map +0 -1
  49. package/dist/models/CreateRoomV2Request.js +0 -48
  50. package/dist/models/CreateRoomV2Request.js.map +0 -1
  51. package/dist/models/CreateRoomV2RequestPlayersInner.d.ts +0 -43
  52. package/dist/models/CreateRoomV2RequestPlayersInner.d.ts.map +0 -1
  53. package/dist/models/CreateRoomV2RequestPlayersInner.js +0 -50
  54. package/dist/models/CreateRoomV2RequestPlayersInner.js.map +0 -1
  55. package/dist/models/CreateRoomV2RequestRoom.d.ts +0 -39
  56. package/dist/models/CreateRoomV2RequestRoom.d.ts.map +0 -1
  57. package/dist/models/CreateRoomV2RequestRoom.js +0 -46
  58. package/dist/models/CreateRoomV2RequestRoom.js.map +0 -1
  59. package/dist/models/CreateRoomV2Response.d.ts +0 -45
  60. package/dist/models/CreateRoomV2Response.d.ts.map +0 -1
  61. package/dist/models/CreateRoomV2Response.js +0 -56
  62. package/dist/models/CreateRoomV2Response.js.map +0 -1
  63. package/dist/models/CreateRoomV2ResponsePayload.d.ts +0 -63
  64. package/dist/models/CreateRoomV2ResponsePayload.d.ts.map +0 -1
  65. package/dist/models/CreateRoomV2ResponsePayload.js +0 -67
  66. package/dist/models/CreateRoomV2ResponsePayload.js.map +0 -1
  67. package/dist/models/CreateRoomV2ResponseUserInfo.d.ts +0 -39
  68. package/dist/models/CreateRoomV2ResponseUserInfo.d.ts.map +0 -1
  69. package/dist/models/CreateRoomV2ResponseUserInfo.js +0 -46
  70. package/dist/models/CreateRoomV2ResponseUserInfo.js.map +0 -1
  71. package/dist/models/CurrencyTier.d.ts +0 -43
  72. package/dist/models/CurrencyTier.d.ts.map +0 -1
  73. package/dist/models/CurrencyTier.js +0 -56
  74. package/dist/models/CurrencyTier.js.map +0 -1
  75. package/dist/models/ErrorResponse.d.ts +0 -35
  76. package/dist/models/ErrorResponse.d.ts.map +0 -1
  77. package/dist/models/ErrorResponse.js +0 -46
  78. package/dist/models/ErrorResponse.js.map +0 -1
  79. package/dist/models/ExchangeLaunchTicketRequest.d.ts +0 -31
  80. package/dist/models/ExchangeLaunchTicketRequest.d.ts.map +0 -1
  81. package/dist/models/ExchangeLaunchTicketRequest.js +0 -44
  82. package/dist/models/ExchangeLaunchTicketRequest.js.map +0 -1
  83. package/dist/models/ExchangeLaunchTicketResponse.d.ts +0 -31
  84. package/dist/models/ExchangeLaunchTicketResponse.d.ts.map +0 -1
  85. package/dist/models/ExchangeLaunchTicketResponse.js +0 -44
  86. package/dist/models/ExchangeLaunchTicketResponse.js.map +0 -1
  87. package/dist/models/FxRate.d.ts +0 -39
  88. package/dist/models/FxRate.d.ts.map +0 -1
  89. package/dist/models/FxRate.js +0 -52
  90. package/dist/models/FxRate.js.map +0 -1
  91. package/dist/models/GameConfig.d.ts +0 -69
  92. package/dist/models/GameConfig.d.ts.map +0 -1
  93. package/dist/models/GameConfig.js +0 -76
  94. package/dist/models/GameConfig.js.map +0 -1
  95. package/dist/models/GameConfigCurrencies.d.ts +0 -36
  96. package/dist/models/GameConfigCurrencies.d.ts.map +0 -1
  97. package/dist/models/GameConfigCurrencies.js +0 -49
  98. package/dist/models/GameConfigCurrencies.js.map +0 -1
  99. package/dist/models/GameConfigFx.d.ts +0 -31
  100. package/dist/models/GameConfigFx.d.ts.map +0 -1
  101. package/dist/models/GameConfigFx.js +0 -44
  102. package/dist/models/GameConfigFx.js.map +0 -1
  103. package/dist/models/HealthResponse.d.ts +0 -39
  104. package/dist/models/HealthResponse.d.ts.map +0 -1
  105. package/dist/models/HealthResponse.js +0 -52
  106. package/dist/models/HealthResponse.js.map +0 -1
  107. package/dist/models/HousePoolResponse.d.ts +0 -45
  108. package/dist/models/HousePoolResponse.d.ts.map +0 -1
  109. package/dist/models/HousePoolResponse.js +0 -58
  110. package/dist/models/HousePoolResponse.js.map +0 -1
  111. package/dist/models/HousePoolStats.d.ts +0 -59
  112. package/dist/models/HousePoolStats.d.ts.map +0 -1
  113. package/dist/models/HousePoolStats.js +0 -56
  114. package/dist/models/HousePoolStats.js.map +0 -1
  115. package/dist/models/LeaderboardEntry.d.ts +0 -59
  116. package/dist/models/LeaderboardEntry.d.ts.map +0 -1
  117. package/dist/models/LeaderboardEntry.js +0 -56
  118. package/dist/models/LeaderboardEntry.js.map +0 -1
  119. package/dist/models/MyBetsResponse.d.ts +0 -49
  120. package/dist/models/MyBetsResponse.d.ts.map +0 -1
  121. package/dist/models/MyBetsResponse.js +0 -54
  122. package/dist/models/MyBetsResponse.js.map +0 -1
  123. package/dist/models/MyHistoryResponse.d.ts +0 -36
  124. package/dist/models/MyHistoryResponse.d.ts.map +0 -1
  125. package/dist/models/MyHistoryResponse.js +0 -49
  126. package/dist/models/MyHistoryResponse.js.map +0 -1
  127. package/dist/models/Phase.d.ts +0 -27
  128. package/dist/models/Phase.d.ts.map +0 -1
  129. package/dist/models/Phase.js +0 -45
  130. package/dist/models/Phase.js.map +0 -1
  131. package/dist/models/PlaceBetRequest.d.ts +0 -45
  132. package/dist/models/PlaceBetRequest.d.ts.map +0 -1
  133. package/dist/models/PlaceBetRequest.js +0 -54
  134. package/dist/models/PlaceBetRequest.js.map +0 -1
  135. package/dist/models/PlaceBetResponse.d.ts +0 -52
  136. package/dist/models/PlaceBetResponse.d.ts.map +0 -1
  137. package/dist/models/PlaceBetResponse.js +0 -65
  138. package/dist/models/PlaceBetResponse.js.map +0 -1
  139. package/dist/models/PlacedBet.d.ts +0 -59
  140. package/dist/models/PlacedBet.d.ts.map +0 -1
  141. package/dist/models/PlacedBet.js +0 -66
  142. package/dist/models/PlacedBet.js.map +0 -1
  143. package/dist/models/Round.d.ts +0 -89
  144. package/dist/models/Round.d.ts.map +0 -1
  145. package/dist/models/Round.js +0 -77
  146. package/dist/models/Round.js.map +0 -1
  147. package/dist/models/RoundHistoryEntry.d.ts +0 -65
  148. package/dist/models/RoundHistoryEntry.d.ts.map +0 -1
  149. package/dist/models/RoundHistoryEntry.js +0 -76
  150. package/dist/models/RoundHistoryEntry.js.map +0 -1
  151. package/dist/models/RoundPlayer.d.ts +0 -59
  152. package/dist/models/RoundPlayer.d.ts.map +0 -1
  153. package/dist/models/RoundPlayer.js +0 -59
  154. package/dist/models/RoundPlayer.js.map +0 -1
  155. package/dist/models/RoundState.d.ts +0 -65
  156. package/dist/models/RoundState.d.ts.map +0 -1
  157. package/dist/models/RoundState.js +0 -62
  158. package/dist/models/RoundState.js.map +0 -1
  159. package/dist/models/RoundsResponse.d.ts +0 -36
  160. package/dist/models/RoundsResponse.d.ts.map +0 -1
  161. package/dist/models/RoundsResponse.js +0 -49
  162. package/dist/models/RoundsResponse.js.map +0 -1
  163. package/dist/models/SettledBet.d.ts +0 -71
  164. package/dist/models/SettledBet.d.ts.map +0 -1
  165. package/dist/models/SettledBet.js +0 -72
  166. package/dist/models/SettledBet.js.map +0 -1
  167. package/dist/models/StatusMessageResponse.d.ts +0 -39
  168. package/dist/models/StatusMessageResponse.d.ts.map +0 -1
  169. package/dist/models/StatusMessageResponse.js +0 -48
  170. package/dist/models/StatusMessageResponse.js.map +0 -1
  171. package/dist/models/TopWinnersResponse.d.ts +0 -45
  172. package/dist/models/TopWinnersResponse.d.ts.map +0 -1
  173. package/dist/models/TopWinnersResponse.js +0 -54
  174. package/dist/models/TopWinnersResponse.js.map +0 -1
  175. package/dist/models/User.d.ts +0 -55
  176. package/dist/models/User.d.ts.map +0 -1
  177. package/dist/models/User.js +0 -61
  178. package/dist/models/User.js.map +0 -1
  179. package/dist/models/UserHistoryResponse.d.ts +0 -48
  180. package/dist/models/UserHistoryResponse.d.ts.map +0 -1
  181. package/dist/models/UserHistoryResponse.js +0 -61
  182. package/dist/models/UserHistoryResponse.js.map +0 -1
  183. package/dist/models/UserRecordResponse.d.ts +0 -36
  184. package/dist/models/UserRecordResponse.d.ts.map +0 -1
  185. package/dist/models/UserRecordResponse.js +0 -49
  186. package/dist/models/UserRecordResponse.js.map +0 -1
  187. package/dist/models/WalletBalanceResponse.d.ts +0 -43
  188. package/dist/models/WalletBalanceResponse.d.ts.map +0 -1
  189. package/dist/models/WalletBalanceResponse.js +0 -50
  190. package/dist/models/WalletBalanceResponse.js.map +0 -1
  191. package/dist/models/index.d.ts +0 -42
  192. package/dist/models/index.d.ts.map +0 -1
  193. package/dist/models/index.js +0 -44
  194. package/dist/models/index.js.map +0 -1
  195. package/dist/runtime.d.ts +0 -218
  196. package/dist/runtime.d.ts.map +0 -1
  197. package/dist/runtime.js +0 -446
  198. package/dist/runtime.js.map +0 -1
@@ -0,0 +1,116 @@
1
+ import { type ManagerOptions, type SocketOptions } from 'socket.io-client';
2
+ import type { AutoMove, BalanceResponse, CreatedRoom, CreateRoomInput, GameDetailsResponse, GameOver, GameType, HealthResponse, Joined, ReconnectionTimer, SpectatorJoined, StatusResponse } from './types.js';
3
+ export declare const DEFAULT_PATHS: {
4
+ health: string;
5
+ createRoom: string;
6
+ getGameDetails: string;
7
+ updateGameType: string;
8
+ userBack: string;
9
+ balance: string;
10
+ exchangeLaunchTicket: string;
11
+ };
12
+ export type EndpointName = keyof typeof DEFAULT_PATHS;
13
+ export interface GameClientOptions {
14
+ /** The game's backend (REST + Socket.IO). */
15
+ backendUrl: string;
16
+ /** GameOn platform backend, needed for isBot(). */
17
+ gameonBackendUrl?: string;
18
+ /** Only for a backend that hasn't moved to the standard paths yet. */
19
+ paths?: Partial<Record<EndpointName, string>>;
20
+ fetchApi?: typeof fetch;
21
+ }
22
+ export declare class GameOnError extends Error {
23
+ readonly status: number;
24
+ readonly body: any;
25
+ constructor(status: number, body: any, url: string);
26
+ /** The backend's error code (e.g. E1008), if it sent one. */
27
+ get code(): string | undefined;
28
+ }
29
+ export declare class GameClient {
30
+ private readonly options;
31
+ private readonly paths;
32
+ constructor(options: GameClientOptions);
33
+ health(): Promise<HealthResponse>;
34
+ createRoom(input: CreateRoomInput): Promise<CreatedRoom>;
35
+ getGameDetails(gameSessionUuid: string): Promise<GameDetailsResponse>;
36
+ updateGameType(gameSessionUuid: string, gameType: GameType): Promise<StatusResponse>;
37
+ /** The player deliberately leaves; the backend resolves the game. */
38
+ userBack(gameSessionUuid: string, uuid: string): Promise<StatusResponse>;
39
+ getBalance(userUuid: string): Promise<BalanceResponse>;
40
+ exchangeLaunchTicket(launchTicket: string): Promise<{
41
+ sessionToken: string;
42
+ }>;
43
+ /** Asks the GameOn platform whether a player uuid belongs to a bot. */
44
+ isBot(uuid: string): Promise<boolean>;
45
+ /** Any endpoint of this game's backend, for game-only features. Throws GameOnError on non-2xx. */
46
+ request<T = any>(method: string, path: string, body?: unknown, query?: Record<string, string | number | boolean | undefined>, baseUrl?: string): Promise<T>;
47
+ /**
48
+ * Opens the realtime connection. joinGame is sent on every (re)connect, so
49
+ * register listeners right after calling this.
50
+ */
51
+ join<State = any>(options: JoinOptions): GameConnection<State>;
52
+ }
53
+ export interface GameEntry {
54
+ backendUrl: string;
55
+ paths?: GameClientOptions['paths'];
56
+ }
57
+ /** For servers that work with many games: one config, one client per game. */
58
+ export declare class GameOnClient {
59
+ private readonly options;
60
+ private readonly clients;
61
+ constructor(options: {
62
+ games: Record<string, GameEntry>;
63
+ gameonBackendUrl?: string;
64
+ fetchApi?: typeof fetch;
65
+ });
66
+ game(name: string): GameClient;
67
+ createRoom(game: string, input: CreateRoomInput): Promise<CreatedRoom>;
68
+ }
69
+ export interface JoinOptions {
70
+ gameSessionUuid: string;
71
+ playerUuid: string;
72
+ playerName?: string;
73
+ socketOptions?: Partial<ManagerOptions & SocketOptions>;
74
+ }
75
+ type Unsubscribe = () => void;
76
+ export declare class GameConnection<State = any> {
77
+ private readonly socket;
78
+ private readonly gameSessionUuid;
79
+ private readonly playerUuid;
80
+ constructor(backendUrl: string, { gameSessionUuid, playerUuid, playerName, socketOptions }: JoinOptions);
81
+ get connected(): boolean;
82
+ disconnect(): void;
83
+ /** The move's shape is the game's own, e.g. { col } for connect4. */
84
+ makeMove(move: Record<string, unknown>): void;
85
+ resetGame(): void;
86
+ startGame(): void;
87
+ startTimerAfterPopup(): void;
88
+ reportTimeout(timeoutPlayer: number): void;
89
+ /** Any client-to-server event, for game-only actions. */
90
+ send(event: string, data?: Record<string, unknown>): void;
91
+ onConnect(handler: () => void): Unsubscribe;
92
+ onDisconnect(handler: (reason: string) => void): Unsubscribe;
93
+ onConnectError(handler: (error: Error) => void): Unsubscribe;
94
+ /** All reconnection attempts used up (a Manager event, not a socket one). */
95
+ onReconnectFailed(handler: () => void): Unsubscribe;
96
+ onGameUpdate(handler: (state: State) => void): Unsubscribe;
97
+ onJoined(handler: (data: Joined) => void): Unsubscribe;
98
+ onSpectatorJoined(handler: (data: SpectatorJoined) => void): Unsubscribe;
99
+ onGameOver(handler: (data: GameOver) => void): Unsubscribe;
100
+ /** Server errors, normalized to an error code such as E1001 (E0000 if unknown). */
101
+ onError(handler: (code: string, raw: unknown) => void): Unsubscribe;
102
+ onReset(handler: () => void): Unsubscribe;
103
+ onTimeoutNotification(handler: (data: {
104
+ timeoutPlayer: number;
105
+ }) => void): Unsubscribe;
106
+ onAutoMove(handler: (data: AutoMove) => void): Unsubscribe;
107
+ onReconnectionTimer(handler: (data: ReconnectionTimer) => void): Unsubscribe;
108
+ onWaitingUpdate(handler: (data: {
109
+ waitingTime: number;
110
+ }) => void): Unsubscribe;
111
+ /** Any server-to-client event, for game-only events. */
112
+ on(event: string, handler: (...args: any[]) => void): Unsubscribe;
113
+ }
114
+ export declare function socketErrorCode(error: unknown): string;
115
+ export {};
116
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/client.js ADDED
@@ -0,0 +1,251 @@
1
+ // One client for every game. Every game backend implements the same endpoints
2
+ // and socket events (specs/gameon.yaml); a game is only a backend URL.
3
+ // Game-only endpoints and events go through request(), send() and on().
4
+ import { io } from 'socket.io-client';
5
+ export const DEFAULT_PATHS = {
6
+ health: '/api/health',
7
+ createRoom: '/api/createRoom',
8
+ getGameDetails: '/api/getGameDetails',
9
+ updateGameType: '/api/updateGameType',
10
+ userBack: '/api/userBack',
11
+ balance: '/api/getUserWalletBalance',
12
+ exchangeLaunchTicket: '/api/exchange-launch-ticket',
13
+ };
14
+ export class GameOnError extends Error {
15
+ constructor(status, body, url) {
16
+ super(`${url} failed (HTTP ${status})${body?.errorCode ? ` ${body.errorCode}` : ''}`);
17
+ this.status = status;
18
+ this.body = body;
19
+ this.name = 'GameOnError';
20
+ }
21
+ /** The backend's error code (e.g. E1008), if it sent one. */
22
+ get code() {
23
+ return this.body?.errorCode;
24
+ }
25
+ }
26
+ export class GameClient {
27
+ constructor(options) {
28
+ this.options = options;
29
+ this.paths = { ...DEFAULT_PATHS, ...options.paths };
30
+ }
31
+ health() {
32
+ return this.request('GET', this.paths.health);
33
+ }
34
+ async createRoom(input) {
35
+ const body = await this.request('POST', this.paths.createRoom, input);
36
+ if (body?.status === false) {
37
+ throw new GameOnError(200, body, this.paths.createRoom);
38
+ }
39
+ const payload = body?.payload ?? {};
40
+ return {
41
+ gameSessionUuid: payload.gameSessionUuid ?? input.room.gameSessionUuid,
42
+ gameStateId: payload.gameStateId,
43
+ links: collectLinks(payload),
44
+ raw: body,
45
+ };
46
+ }
47
+ getGameDetails(gameSessionUuid) {
48
+ return this.request('GET', this.paths.getGameDetails, undefined, { gameSessionUuid });
49
+ }
50
+ updateGameType(gameSessionUuid, gameType) {
51
+ return this.request('POST', this.paths.updateGameType, { gameSessionUuid, gameType });
52
+ }
53
+ /** The player deliberately leaves; the backend resolves the game. */
54
+ userBack(gameSessionUuid, uuid) {
55
+ return this.request('POST', this.paths.userBack, { gameSessionUuid, uuid });
56
+ }
57
+ getBalance(userUuid) {
58
+ return this.request('GET', this.paths.balance, undefined, { userUuid });
59
+ }
60
+ exchangeLaunchTicket(launchTicket) {
61
+ return this.request('POST', this.paths.exchangeLaunchTicket, { launchTicket });
62
+ }
63
+ /** Asks the GameOn platform whether a player uuid belongs to a bot. */
64
+ async isBot(uuid) {
65
+ if (!this.options.gameonBackendUrl) {
66
+ throw new Error('isBot needs gameonBackendUrl in the client options');
67
+ }
68
+ const body = await this.request('GET', '/api/sdk/v1/game-session/is-bot', undefined, { uuid }, this.options.gameonBackendUrl);
69
+ return body?.content === true;
70
+ }
71
+ /** Any endpoint of this game's backend, for game-only features. Throws GameOnError on non-2xx. */
72
+ async request(method, path, body, query, baseUrl = this.options.backendUrl) {
73
+ const url = new URL(baseUrl.replace(/\/+$/, '') + path);
74
+ for (const [key, value] of Object.entries(query ?? {})) {
75
+ if (value !== undefined)
76
+ url.searchParams.set(key, String(value));
77
+ }
78
+ const response = await (this.options.fetchApi ?? fetch)(url.toString(), {
79
+ method,
80
+ headers: body === undefined ? undefined : { 'Content-Type': 'application/json' },
81
+ body: body === undefined ? undefined : JSON.stringify(body),
82
+ });
83
+ const text = await response.text();
84
+ let parsed;
85
+ try {
86
+ parsed = text ? JSON.parse(text) : undefined;
87
+ }
88
+ catch {
89
+ parsed = text;
90
+ }
91
+ if (!response.ok) {
92
+ throw new GameOnError(response.status, parsed, path);
93
+ }
94
+ return parsed;
95
+ }
96
+ /**
97
+ * Opens the realtime connection. joinGame is sent on every (re)connect, so
98
+ * register listeners right after calling this.
99
+ */
100
+ join(options) {
101
+ return new GameConnection(this.options.backendUrl, options);
102
+ }
103
+ }
104
+ /** For servers that work with many games: one config, one client per game. */
105
+ export class GameOnClient {
106
+ constructor(options) {
107
+ this.options = options;
108
+ this.clients = new Map();
109
+ }
110
+ game(name) {
111
+ let client = this.clients.get(name);
112
+ if (!client) {
113
+ const entry = this.options.games[name];
114
+ if (!entry) {
115
+ throw new Error(`Unknown game "${name}". Configured games: ${Object.keys(this.options.games).join(', ')}`);
116
+ }
117
+ client = new GameClient({
118
+ ...entry,
119
+ gameonBackendUrl: this.options.gameonBackendUrl,
120
+ fetchApi: this.options.fetchApi,
121
+ });
122
+ this.clients.set(name, client);
123
+ }
124
+ return client;
125
+ }
126
+ createRoom(game, input) {
127
+ return this.game(game).createRoom(input);
128
+ }
129
+ }
130
+ export class GameConnection {
131
+ constructor(backendUrl, { gameSessionUuid, playerUuid, playerName, socketOptions }) {
132
+ this.gameSessionUuid = gameSessionUuid;
133
+ this.playerUuid = playerUuid;
134
+ this.socket = io(backendUrl, {
135
+ reconnection: true,
136
+ reconnectionAttempts: 10,
137
+ reconnectionDelay: 1000,
138
+ ...socketOptions,
139
+ });
140
+ this.socket.on('connect', () => {
141
+ this.socket.emit('joinGame', { gameSessionUuid, playerUuid, playerName });
142
+ });
143
+ }
144
+ get connected() {
145
+ return this.socket.connected;
146
+ }
147
+ disconnect() {
148
+ this.socket.disconnect();
149
+ }
150
+ // --- actions (gameSessionUuid is added for you) ---
151
+ /** The move's shape is the game's own, e.g. { col } for connect4. */
152
+ makeMove(move) {
153
+ this.send('makeMove', move);
154
+ }
155
+ resetGame() {
156
+ this.send('resetGame');
157
+ }
158
+ startGame() {
159
+ this.send('startGame');
160
+ }
161
+ startTimerAfterPopup() {
162
+ this.send('startTimerAfterPopup');
163
+ }
164
+ reportTimeout(timeoutPlayer) {
165
+ this.send('mainTimerTimeout', { playerUuid: this.playerUuid, timeoutPlayer });
166
+ }
167
+ /** Any client-to-server event, for game-only actions. */
168
+ send(event, data = {}) {
169
+ this.socket.emit(event, { gameSessionUuid: this.gameSessionUuid, ...data });
170
+ }
171
+ // --- connection lifecycle ---
172
+ onConnect(handler) {
173
+ return this.on('connect', handler);
174
+ }
175
+ onDisconnect(handler) {
176
+ return this.on('disconnect', handler);
177
+ }
178
+ onConnectError(handler) {
179
+ return this.on('connect_error', handler);
180
+ }
181
+ /** All reconnection attempts used up (a Manager event, not a socket one). */
182
+ onReconnectFailed(handler) {
183
+ this.socket.io.on('reconnect_failed', handler);
184
+ return () => this.socket.io.off('reconnect_failed', handler);
185
+ }
186
+ // --- common game events ---
187
+ onGameUpdate(handler) {
188
+ return this.on('gameUpdate', handler);
189
+ }
190
+ onJoined(handler) {
191
+ return this.on('joined', handler);
192
+ }
193
+ onSpectatorJoined(handler) {
194
+ return this.on('spectatorJoined', handler);
195
+ }
196
+ onGameOver(handler) {
197
+ return this.on('gameOver', handler);
198
+ }
199
+ /** Server errors, normalized to an error code such as E1001 (E0000 if unknown). */
200
+ onError(handler) {
201
+ return this.on('error', (raw) => handler(socketErrorCode(raw), raw));
202
+ }
203
+ onReset(handler) {
204
+ return this.on('resetGame', handler);
205
+ }
206
+ onTimeoutNotification(handler) {
207
+ return this.on('mainTimerTimeoutNotification', handler);
208
+ }
209
+ onAutoMove(handler) {
210
+ return this.on('autoMove', handler);
211
+ }
212
+ onReconnectionTimer(handler) {
213
+ return this.on('reconnectionTimer', handler);
214
+ }
215
+ onWaitingUpdate(handler) {
216
+ return this.on('waitingUpdate', handler);
217
+ }
218
+ /** Any server-to-client event, for game-only events. */
219
+ on(event, handler) {
220
+ this.socket.on(event, handler);
221
+ return () => this.socket.off(event, handler);
222
+ }
223
+ }
224
+ /** Picks up `link`, `link1`, `link2`, ... in numeric order, skipping empty ones. */
225
+ function collectLinks(payload) {
226
+ if (Array.isArray(payload.links))
227
+ return payload.links.filter((link) => typeof link === 'string' && link);
228
+ return Object.keys(payload)
229
+ .filter((key) => /^link\d*$/.test(key) && typeof payload[key] === 'string' && payload[key])
230
+ .sort((a, b) => Number(a.slice(4) || 0) - Number(b.slice(4) || 0))
231
+ .map((key) => payload[key]);
232
+ }
233
+ /** Older servers send error strings instead of { code }. */
234
+ const ERROR_MESSAGE_CODES = [
235
+ ['Invalid game session', 'E1001'],
236
+ ['You are not authorized', 'E1002'],
237
+ ['Bot players cannot make manual moves', 'E1003'],
238
+ ['already ended', 'E1004'],
239
+ ['Cannot join finished game', 'E1004'],
240
+ ['Game room is full', 'E1005'],
241
+ ];
242
+ export function socketErrorCode(error) {
243
+ if (error && typeof error === 'object' && typeof error.code === 'string') {
244
+ return error.code;
245
+ }
246
+ if (typeof error === 'string') {
247
+ return ERROR_MESSAGE_CODES.find(([text]) => error.includes(text))?.[1] ?? 'E0000';
248
+ }
249
+ return 'E0000';
250
+ }
251
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- export * from './runtime.js';
2
- export * from './apis/index.js';
3
- export * from './models/index.js';
1
+ export * from './client.js';
2
+ export * from './types.js';
4
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,3 @@
1
- /* tslint:disable */
2
- /* eslint-disable */
3
- export * from './runtime.js';
4
- export * from './apis/index.js';
5
- export * from './models/index.js';
1
+ export * from './client.js';
2
+ export * from './types.js';
6
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,oBAAoB;AACpB,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,193 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/server.ts
21
+ var server_exports = {};
22
+ __export(server_exports, {
23
+ GameOnPlatform: () => GameOnPlatform,
24
+ GameOnPlatformError: () => GameOnPlatformError,
25
+ WIN_POINTS: () => WIN_POINTS,
26
+ signPayload: () => signPayload
27
+ });
28
+ module.exports = __toCommonJS(server_exports);
29
+ var import_node_crypto = require("node:crypto");
30
+ var WIN_POINTS = 100;
31
+ var GameOnPlatformError = class extends Error {
32
+ constructor(status, body, path) {
33
+ super(`GameOn ${path} failed (HTTP ${status})${body?.message ? `: ${body.message}` : ""}`);
34
+ this.status = status;
35
+ this.body = body;
36
+ this.name = "GameOnPlatformError";
37
+ }
38
+ /** GameOn's numeric error code, e.g. 420001 (invalid signature). */
39
+ get errorCode() {
40
+ return this.body?.error_code;
41
+ }
42
+ };
43
+ function signPayload(payload, privateKey) {
44
+ const body = JSON.stringify(payload);
45
+ const signer = (0, import_node_crypto.createSign)("RSA-SHA256");
46
+ signer.update(body);
47
+ signer.end();
48
+ return { signature: signer.sign(privateKey, "base64"), body };
49
+ }
50
+ var GameOnPlatform = class {
51
+ constructor(options) {
52
+ this.options = options;
53
+ }
54
+ // --- results ---
55
+ /**
56
+ * Reports a finished game the same way for every game: tournament games go
57
+ * to the match result, all others to game_session_finish. A tournament with
58
+ * no clear winner and loser (a draw) is not reported; returns false then.
59
+ */
60
+ async reportGameResult(result) {
61
+ if (result.gameType === "TOURNAMENT") {
62
+ const winner = result.players.find((p) => p.winState === "WON");
63
+ const loser = result.players.find((p) => ["DEFEATED", "DROPPED", "CRASHED"].includes(p.winState));
64
+ if (!winner || !loser) return false;
65
+ if (result.matchId == null) {
66
+ throw new Error(`Tournament game ${result.gameSessionUuid} has no matchId`);
67
+ }
68
+ await this.reportTournamentResult(result.matchId, {
69
+ winnerUuid: winner.uuid,
70
+ loserUuid: loser.uuid,
71
+ score: { [winner.name ?? winner.uuid]: WIN_POINTS, [loser.name ?? loser.uuid]: 0 },
72
+ gameSessionUuid: result.gameSessionUuid
73
+ });
74
+ return true;
75
+ }
76
+ await this.finishGameSession({
77
+ gameSessionUuid: result.gameSessionUuid,
78
+ gameStatus: result.gameStatus,
79
+ players: result.players.map((p) => ({
80
+ uuid: p.uuid,
81
+ points: p.winState === "WON" ? WIN_POINTS : 0,
82
+ userGameSessionStatus: p.winState
83
+ }))
84
+ });
85
+ return true;
86
+ }
87
+ /** POST /api/external_game/v1/game_session_finish */
88
+ finishGameSession(input) {
89
+ return this.post("/api/external_game/v1/game_session_finish", input);
90
+ }
91
+ /** POST /tounament/api/matches/{matchId}/result (the platform's path is spelled "tounament"). */
92
+ reportTournamentResult(matchId, input) {
93
+ return this.post(`/tounament/api/matches/${encodeURIComponent(matchId)}/result`, {
94
+ winner_uuid: input.winnerUuid,
95
+ loser_uuid: input.loserUuid,
96
+ score: input.score,
97
+ game_session_id: input.gameSessionUuid
98
+ });
99
+ }
100
+ // --- players & coins ---
101
+ /** The player's live coin balance (signed). */
102
+ async getUserCoinBalance(userUuid) {
103
+ const { signature } = signPayload({ userUuid }, this.requirePrivateKey());
104
+ const body = await this.call("GET", `/api/sdk/v1/game-session/get-user-coin-balance?userUuid=${encodeURIComponent(userUuid)}`, {
105
+ headers: this.signedHeaders(signature)
106
+ });
107
+ if (!body?.status || typeof body.content !== "number") {
108
+ throw new GameOnPlatformError(200, body, "get-user-coin-balance");
109
+ }
110
+ return body.content;
111
+ }
112
+ /** Whether a player uuid belongs to a platform bot. */
113
+ async isBot(uuid) {
114
+ const body = await this.call("GET", `/api/sdk/v1/game-session/is-bot?uuid=${encodeURIComponent(uuid)}`);
115
+ return body?.content === true;
116
+ }
117
+ /** Creates the player's game session and holds the stake. */
118
+ async createUserGameSession(input) {
119
+ const body = await this.post("/api/sdk/v1/game-session/create-user-game-sessionv2", {
120
+ sessionUuid: input.sessionUuid,
121
+ sessionToken: input.sessionToken,
122
+ gameSessionUuid: input.gameSessionUuid,
123
+ amount: input.amount,
124
+ actionType: "HOLD",
125
+ ...input.type ? { type: input.type } : {}
126
+ });
127
+ if (!body?.status) throw new GameOnPlatformError(200, body, "create-user-game-sessionv2");
128
+ return body;
129
+ }
130
+ /** Moves coins for a player: RELEASE, CAPTURE or WIN (signed). Not retried - the caller decides. */
131
+ async updateUserCoins(input) {
132
+ const payload = {
133
+ uuid: input.uuid,
134
+ actionType: input.actionType,
135
+ amount: input.amount,
136
+ sessionUuid: input.sessionUuid,
137
+ ...input.type ? { type: input.type } : {}
138
+ };
139
+ const { signature, body } = signPayload(payload, this.requirePrivateKey());
140
+ const response = await this.call("POST", "/api/sdk/v1/game-session/usercoin-action/update", {
141
+ headers: { "Content-Type": "application/json", ...this.signedHeaders(signature) },
142
+ body
143
+ });
144
+ if (!response?.status) throw new GameOnPlatformError(200, response, "usercoin-action/update");
145
+ return response;
146
+ }
147
+ // --- transport ---
148
+ post(path, payload) {
149
+ return this.call("POST", path, {
150
+ headers: { "Content-Type": "application/json" },
151
+ body: JSON.stringify(payload)
152
+ });
153
+ }
154
+ async call(method, path, init = {}) {
155
+ const url = this.options.baseUrl.replace(/\/+$/, "") + path;
156
+ const response = await (this.options.fetchApi ?? fetch)(url, {
157
+ method,
158
+ headers: init.headers,
159
+ body: init.body,
160
+ signal: AbortSignal.timeout(this.options.timeoutMs ?? 15e3)
161
+ });
162
+ const text = await response.text();
163
+ let parsed;
164
+ try {
165
+ parsed = text ? JSON.parse(text) : void 0;
166
+ } catch {
167
+ parsed = text;
168
+ }
169
+ if (!response.ok) {
170
+ throw new GameOnPlatformError(response.status, parsed, path.split("?")[0]);
171
+ }
172
+ return parsed;
173
+ }
174
+ signedHeaders(signature) {
175
+ if (!this.options.developerId) {
176
+ throw new Error("This call is signed: pass developerId in GameOnPlatform options");
177
+ }
178
+ return { "X-Developer-ID": this.options.developerId, "X-Signature": signature };
179
+ }
180
+ requirePrivateKey() {
181
+ if (!this.options.privateKey) {
182
+ throw new Error("This call is signed: pass privateKey (PEM) in GameOnPlatform options");
183
+ }
184
+ return this.options.privateKey;
185
+ }
186
+ };
187
+ // Annotate the CommonJS export names for ESM import in node:
188
+ 0 && (module.exports = {
189
+ GameOnPlatform,
190
+ GameOnPlatformError,
191
+ WIN_POINTS,
192
+ signPayload
193
+ });