@phalanx-engine/client 0.1.0

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 (94) hide show
  1. package/README.md +1037 -0
  2. package/dist/DesyncDetector.d.ts +80 -0
  3. package/dist/DesyncDetector.d.ts.map +1 -0
  4. package/dist/DesyncDetector.js +93 -0
  5. package/dist/DesyncDetector.js.map +1 -0
  6. package/dist/DeterministicRandom.d.ts +78 -0
  7. package/dist/DeterministicRandom.d.ts.map +1 -0
  8. package/dist/DeterministicRandom.js +122 -0
  9. package/dist/DeterministicRandom.js.map +1 -0
  10. package/dist/EventEmitter.d.ts +65 -0
  11. package/dist/EventEmitter.d.ts.map +1 -0
  12. package/dist/EventEmitter.js +102 -0
  13. package/dist/EventEmitter.js.map +1 -0
  14. package/dist/FixedMath.d.ts +22 -0
  15. package/dist/FixedMath.d.ts.map +1 -0
  16. package/dist/FixedMath.js +26 -0
  17. package/dist/FixedMath.js.map +1 -0
  18. package/dist/PhalanxClient.d.ts +335 -0
  19. package/dist/PhalanxClient.d.ts.map +1 -0
  20. package/dist/PhalanxClient.js +844 -0
  21. package/dist/PhalanxClient.js.map +1 -0
  22. package/dist/RenderLoop.d.ts +95 -0
  23. package/dist/RenderLoop.d.ts.map +1 -0
  24. package/dist/RenderLoop.js +192 -0
  25. package/dist/RenderLoop.js.map +1 -0
  26. package/dist/SocketManager.d.ts +228 -0
  27. package/dist/SocketManager.d.ts.map +1 -0
  28. package/dist/SocketManager.js +584 -0
  29. package/dist/SocketManager.js.map +1 -0
  30. package/dist/StateHasher.d.ts +76 -0
  31. package/dist/StateHasher.d.ts.map +1 -0
  32. package/dist/StateHasher.js +129 -0
  33. package/dist/StateHasher.js.map +1 -0
  34. package/dist/auth/AuthManager.d.ts +188 -0
  35. package/dist/auth/AuthManager.d.ts.map +1 -0
  36. package/dist/auth/AuthManager.js +462 -0
  37. package/dist/auth/AuthManager.js.map +1 -0
  38. package/dist/auth/adapters/GoogleOAuthAdapter.d.ts +164 -0
  39. package/dist/auth/adapters/GoogleOAuthAdapter.d.ts.map +1 -0
  40. package/dist/auth/adapters/GoogleOAuthAdapter.js +521 -0
  41. package/dist/auth/adapters/GoogleOAuthAdapter.js.map +1 -0
  42. package/dist/auth/index.d.ts +45 -0
  43. package/dist/auth/index.d.ts.map +1 -0
  44. package/dist/auth/index.js +54 -0
  45. package/dist/auth/index.js.map +1 -0
  46. package/dist/auth/storage.d.ts +56 -0
  47. package/dist/auth/storage.d.ts.map +1 -0
  48. package/dist/auth/storage.js +78 -0
  49. package/dist/auth/storage.js.map +1 -0
  50. package/dist/auth/types.d.ts +212 -0
  51. package/dist/auth/types.d.ts.map +1 -0
  52. package/dist/auth/types.js +7 -0
  53. package/dist/auth/types.js.map +1 -0
  54. package/dist/index.d.ts +70 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +83 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/recovery/BrowserLifecycle.d.ts +33 -0
  59. package/dist/recovery/BrowserLifecycle.d.ts.map +1 -0
  60. package/dist/recovery/BrowserLifecycle.js +62 -0
  61. package/dist/recovery/BrowserLifecycle.js.map +1 -0
  62. package/dist/recovery/GuestPlayerIdStore.d.ts +17 -0
  63. package/dist/recovery/GuestPlayerIdStore.d.ts.map +1 -0
  64. package/dist/recovery/GuestPlayerIdStore.js +31 -0
  65. package/dist/recovery/GuestPlayerIdStore.js.map +1 -0
  66. package/dist/recovery/KeyValueStorage.d.ts +32 -0
  67. package/dist/recovery/KeyValueStorage.d.ts.map +1 -0
  68. package/dist/recovery/KeyValueStorage.js +58 -0
  69. package/dist/recovery/KeyValueStorage.js.map +1 -0
  70. package/dist/recovery/MobileTransport.d.ts +12 -0
  71. package/dist/recovery/MobileTransport.d.ts.map +1 -0
  72. package/dist/recovery/MobileTransport.js +24 -0
  73. package/dist/recovery/MobileTransport.js.map +1 -0
  74. package/dist/recovery/NetworkQuality.d.ts +22 -0
  75. package/dist/recovery/NetworkQuality.d.ts.map +1 -0
  76. package/dist/recovery/NetworkQuality.js +35 -0
  77. package/dist/recovery/NetworkQuality.js.map +1 -0
  78. package/dist/recovery/RoomPersistence.d.ts +55 -0
  79. package/dist/recovery/RoomPersistence.d.ts.map +1 -0
  80. package/dist/recovery/RoomPersistence.js +68 -0
  81. package/dist/recovery/RoomPersistence.js.map +1 -0
  82. package/dist/recovery/RoomRecoveryController.d.ts +146 -0
  83. package/dist/recovery/RoomRecoveryController.d.ts.map +1 -0
  84. package/dist/recovery/RoomRecoveryController.js +348 -0
  85. package/dist/recovery/RoomRecoveryController.js.map +1 -0
  86. package/dist/recovery/index.d.ts +13 -0
  87. package/dist/recovery/index.d.ts.map +1 -0
  88. package/dist/recovery/index.js +8 -0
  89. package/dist/recovery/index.js.map +1 -0
  90. package/dist/types.d.ts +501 -0
  91. package/dist/types.d.ts.map +1 -0
  92. package/dist/types.js +6 -0
  93. package/dist/types.js.map +1 -0
  94. package/package.json +66 -0
@@ -0,0 +1,335 @@
1
+ /**
2
+ * Phalanx Client
3
+ * Client library for connecting to Phalanx Engine servers
4
+ */
5
+ import { EventEmitter } from './EventEmitter.js';
6
+ import { type DesyncConfig } from './DesyncDetector.js';
7
+ import { RoomRecoveryController } from './recovery/index.js';
8
+ import type { PhalanxClientConfig, PhalanxClientEvents, PhalanxAuthState, PhalanxAuthUser, PlayerCommand, MatchFoundEvent, CountdownEvent, GameStartEvent, QueueStatusEvent, ReconnectStateEvent, SubmitCommandsAck, ConnectionState, ClientState, TickHandler, FrameHandler, Unsubscribe, PauseHandler, RoomCreatedEvent, RoomRecoveredEvent } from './types.js';
9
+ /**
10
+ * PhalanxClient - Main client class for connecting to Phalanx Engine servers
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * const client = await PhalanxClient.create({
15
+ * serverUrl: 'http://localhost:3000',
16
+ * playerId: 'player-123',
17
+ * username: 'MyPlayer',
18
+ * });
19
+ *
20
+ * client.on('matchFound', (data) => console.log('Match found!'));
21
+ * client.on('gameStart', () => console.log('Game started!'));
22
+ *
23
+ * await client.joinQueue();
24
+ *
25
+ * client.onTick((tick, commands) => {
26
+ * // Process commands and run simulation
27
+ * });
28
+ *
29
+ * client.onFrame((alpha, dt) => {
30
+ * // Interpolate and render
31
+ * });
32
+ * ```
33
+ */
34
+ export declare class PhalanxClient extends EventEmitter<PhalanxClientEvents> {
35
+ private config;
36
+ private socketManager;
37
+ private renderLoop;
38
+ private desyncDetector;
39
+ private authManager;
40
+ private _roomRecovery;
41
+ private clientState;
42
+ private currentMatchId;
43
+ private currentTick;
44
+ private authState;
45
+ private pendingCommands;
46
+ private pauseHandlers;
47
+ private resumeHandlers;
48
+ constructor(config: PhalanxClientConfig);
49
+ private createRoomRecoveryController;
50
+ /**
51
+ * Mobile-friendly room recovery controller. `null` unless
52
+ * `roomRecovery.enabled` was set in the config. See
53
+ * `RoomRecoveryController` for the surface — typically you only
54
+ * need `startTrackingHost(code)` after creating a private room and
55
+ * `loadColdStartCode()` on app startup.
56
+ */
57
+ get roomRecovery(): RoomRecoveryController | null;
58
+ /**
59
+ * Initialize authentication manager
60
+ */
61
+ private initializeAuth;
62
+ /**
63
+ * Handle auth state changes from AuthManager
64
+ */
65
+ private handleAuthStateChange;
66
+ /**
67
+ * Handle OAuth callback from redirect
68
+ */
69
+ private handleAuthCallback;
70
+ /**
71
+ * Start login flow (redirects to OAuth provider)
72
+ */
73
+ login(): void;
74
+ /**
75
+ * Log out the current user
76
+ */
77
+ logout(): Promise<void>;
78
+ /**
79
+ * Get current authentication state
80
+ */
81
+ getAuthState(): PhalanxAuthState;
82
+ /**
83
+ * Check if user is authenticated
84
+ */
85
+ isAuthenticated(): boolean;
86
+ /**
87
+ * Get current user info
88
+ */
89
+ getUser(): PhalanxAuthUser | null;
90
+ /**
91
+ * Create and connect a new PhalanxClient
92
+ * @param config Client configuration
93
+ * @returns Connected PhalanxClient instance
94
+ */
95
+ static create(config: PhalanxClientConfig): Promise<PhalanxClient>;
96
+ /**
97
+ * Connect to the Phalanx server
98
+ * @returns Promise that resolves when connected
99
+ * @throws Error if connection fails or times out
100
+ */
101
+ connect(): Promise<void>;
102
+ /**
103
+ * Disconnect from the server
104
+ */
105
+ disconnect(): void;
106
+ /**
107
+ * Destroy the client and clean up all resources
108
+ */
109
+ destroy(): void;
110
+ /**
111
+ * Check if client is connected to the server
112
+ */
113
+ isConnected(): boolean;
114
+ /**
115
+ * Get current connection state
116
+ */
117
+ getConnectionState(): ConnectionState;
118
+ /**
119
+ * Get current client state
120
+ */
121
+ getClientState(): ClientState;
122
+ /**
123
+ * Join the matchmaking queue
124
+ * @returns Promise that resolves with queue status
125
+ */
126
+ joinQueue(): Promise<QueueStatusEvent>;
127
+ /**
128
+ * Leave the matchmaking queue
129
+ */
130
+ leaveQueue(): void;
131
+ /**
132
+ * Create a private room and wait for the room code.
133
+ * After creation, the host should wait for match-found (when another player joins).
134
+ */
135
+ createRoom(gameType?: string): Promise<RoomCreatedEvent>;
136
+ /**
137
+ * Join a private room by code.
138
+ * The server will create a match and emit match-found to both players.
139
+ */
140
+ joinRoom(code: string): void;
141
+ /**
142
+ * Cancel a previously created private room.
143
+ */
144
+ cancelRoom(): void;
145
+ /**
146
+ * Reclaim a private room after a transient socket disconnect.
147
+ *
148
+ * Call this after `connect()` has re-established the underlying socket
149
+ * (typically inside a `visibilitychange` listener, or the first thing
150
+ * on `pageshow` from bfcache) to tell the server to re-bind the still-
151
+ * living room / in-flight match to this new socket.
152
+ *
153
+ * On success the server emits `match-found` (if a guest had already
154
+ * joined) followed by `reconnect-state` carrying a countdown snapshot,
155
+ * which `SocketManager`'s global `reconnect-state` handler fans out
156
+ * through the local `countdown` and `game-start` listeners so any
157
+ * `waitForCountdown` / `waitForGameStart` promises pending since the
158
+ * original flow resume naturally.
159
+ *
160
+ * Rejects with the server's `room-error` message (e.g. `'Room expired'`)
161
+ * or `'Recover timeout'` if the server doesn't answer before the configured
162
+ * recovery timeout.
163
+ */
164
+ recoverRoom(code: string, timeoutMs?: number): Promise<RoomRecoveredEvent>;
165
+ /**
166
+ * Request the server to pause the game.
167
+ * The game will not freeze immediately — it freezes only when the server
168
+ * broadcasts the 'game-paused' event back to all clients, ensuring
169
+ * every client pauses at the same deterministic point.
170
+ */
171
+ pauseGame(): void;
172
+ /**
173
+ * Request the server to resume the game.
174
+ * Same as pause — the actual resume occurs when the server broadcasts
175
+ * 'game-resumed' to all clients.
176
+ */
177
+ resumeGame(): void;
178
+ /**
179
+ * Notify the server that this client has finished loading and is ready to receive ticks.
180
+ * Must be called after assets are loaded and game systems are initialized.
181
+ * The server will not start the tick loop until all clients report ready.
182
+ */
183
+ sendReady(): void;
184
+ /**
185
+ * Wait for a match to be found
186
+ * @returns Promise that resolves with match found event
187
+ */
188
+ waitForMatch(): Promise<MatchFoundEvent>;
189
+ /**
190
+ * Join queue and wait for match in one call
191
+ * @returns Promise that resolves with match found event
192
+ */
193
+ joinQueueAndWaitForMatch(): Promise<MatchFoundEvent>;
194
+ /**
195
+ * Wait for countdown to complete (listening to countdown events)
196
+ * @param onCountdown Optional callback for each countdown tick
197
+ * @returns Promise that resolves when countdown reaches 0
198
+ */
199
+ waitForCountdown(onCountdown?: (event: CountdownEvent) => void): Promise<void>;
200
+ /**
201
+ * Wait for the game to start
202
+ * @returns Promise that resolves with game start event
203
+ */
204
+ waitForGameStart(): Promise<GameStartEvent>;
205
+ /**
206
+ * Submit commands for a specific tick
207
+ * @param tick The tick number these commands are for
208
+ * @param commands Array of commands to submit
209
+ * @returns Promise that resolves with acknowledgment
210
+ */
211
+ submitCommands(tick: number, commands: PlayerCommand[]): Promise<SubmitCommandsAck>;
212
+ /**
213
+ * Submit commands without waiting for acknowledgment (fire and forget)
214
+ * @param tick The tick number these commands are for
215
+ * @param commands Array of commands to submit
216
+ */
217
+ submitCommandsAsync(tick: number, commands: PlayerCommand[]): void;
218
+ /**
219
+ * Send a command to the server
220
+ * Commands are buffered and sent automatically each frame
221
+ *
222
+ * @param type Command type (e.g., 'move', 'attack')
223
+ * @param data Command payload
224
+ */
225
+ sendCommand(type: string, data: unknown): void;
226
+ /**
227
+ * Register a callback for simulation ticks
228
+ * Called when the server sends a tick with commands from all players
229
+ *
230
+ * @param handler Callback receiving tick number and commands grouped by player
231
+ * @returns Unsubscribe function
232
+ */
233
+ onTick(handler: TickHandler): Unsubscribe;
234
+ /**
235
+ * Register a callback for render frames
236
+ * Called every animation frame (~60fps) with interpolation alpha
237
+ * Automatically starts the render loop when first handler is added
238
+ *
239
+ * @param handler Callback receiving alpha (0-1) and delta time in seconds
240
+ * @returns Unsubscribe function
241
+ */
242
+ onFrame(handler: FrameHandler): Unsubscribe;
243
+ /**
244
+ * Request the server to pause the game (ITickFrameProvider contract).
245
+ * The actual pause is signalled asynchronously via onPause when the
246
+ * server broadcasts 'game-paused' to all clients.
247
+ */
248
+ requestPause(): void;
249
+ /**
250
+ * Request the server to resume the game (ITickFrameProvider contract).
251
+ * The actual resume is signalled asynchronously via onResume when the
252
+ * server broadcasts 'game-resumed' to all clients.
253
+ */
254
+ requestResume(): void;
255
+ /**
256
+ * Subscribe to the "paused" signal (ITickFrameProvider contract).
257
+ * Fired when the server confirms the pause and broadcasts it.
258
+ */
259
+ onPause(handler: PauseHandler): Unsubscribe;
260
+ /**
261
+ * Subscribe to the "resumed" signal (ITickFrameProvider contract).
262
+ * Fired when the server confirms the resume and broadcasts it.
263
+ */
264
+ onResume(handler: PauseHandler): Unsubscribe;
265
+ /**
266
+ * Attempt to reconnect to a match after disconnection
267
+ * @param matchId The match ID to reconnect to
268
+ * @returns Promise that resolves with reconnection state
269
+ */
270
+ reconnectToMatch(matchId: string): Promise<ReconnectStateEvent>;
271
+ /**
272
+ * Attempt automatic reconnection with retries
273
+ * @returns Promise that resolves when reconnected, rejects if all attempts fail
274
+ */
275
+ attemptReconnection(): Promise<void>;
276
+ /**
277
+ * Submit state hash for desync detection
278
+ * Call this after each simulation tick (or every N ticks based on your preference)
279
+ *
280
+ * The game is responsible for computing the hash using StateHasher or
281
+ * a custom implementation. The SDK just handles transport and comparison.
282
+ *
283
+ * @param tick - The tick this hash is for
284
+ * @param hash - Hash computed by game (any string)
285
+ *
286
+ * @example
287
+ * ```typescript
288
+ * client.onTick((tick, commands) => {
289
+ * simulation.processTick(tick, commands);
290
+ *
291
+ * // Submit hash every 20 ticks (once per second at 20 TPS)
292
+ * if (tick % 20 === 0) {
293
+ * const hash = computeGameStateHash(tick);
294
+ * client.submitStateHash(tick, hash);
295
+ * }
296
+ * });
297
+ * ```
298
+ */
299
+ submitStateHash(tick: number, hash: string): void;
300
+ /**
301
+ * Configure desync detection
302
+ * @param config - Configuration options for desync detection
303
+ *
304
+ * @example
305
+ * ```typescript
306
+ * // Disable desync detection
307
+ * client.configureDesyncDetection({ enabled: false });
308
+ *
309
+ * // Limit stored hashes
310
+ * client.configureDesyncDetection({ maxStoredHashes: 50 });
311
+ * ```
312
+ */
313
+ configureDesyncDetection(config: Partial<DesyncConfig>): void;
314
+ /**
315
+ * Get current tick number
316
+ */
317
+ getCurrentTick(): number;
318
+ /**
319
+ * Get current match ID
320
+ */
321
+ getMatchId(): string | null;
322
+ /**
323
+ * Get player ID configured for this client
324
+ */
325
+ getPlayerId(): string;
326
+ /**
327
+ * Get username configured for this client
328
+ */
329
+ getUsername(): string;
330
+ private flushPendingCommands;
331
+ private ensureConnected;
332
+ private ensurePlaying;
333
+ private log;
334
+ }
335
+ //# sourceMappingURL=PhalanxClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PhalanxClient.d.ts","sourceRoot":"","sources":["../src/PhalanxClient.ts"],"names":[],"mappings":"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"}