quake2ts 0.0.557 → 0.0.562

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 (51) hide show
  1. package/package.json +3 -1
  2. package/packages/client/dist/browser/index.global.js +15 -15
  3. package/packages/client/dist/browser/index.global.js.map +1 -1
  4. package/packages/client/dist/cjs/index.cjs +343 -1
  5. package/packages/client/dist/cjs/index.cjs.map +1 -1
  6. package/packages/client/dist/esm/index.js +343 -1
  7. package/packages/client/dist/esm/index.js.map +1 -1
  8. package/packages/client/dist/tsconfig.tsbuildinfo +1 -1
  9. package/packages/client/dist/types/index.d.ts.map +1 -1
  10. package/packages/client/dist/types/net/connection.d.ts +2 -0
  11. package/packages/client/dist/types/net/connection.d.ts.map +1 -1
  12. package/packages/engine/dist/tsconfig.tsbuildinfo +1 -1
  13. package/packages/engine/dist/types/render/bloom.d.ts +19 -0
  14. package/packages/engine/dist/types/render/bloom.d.ts.map +1 -0
  15. package/packages/engine/dist/types/render/frame.d.ts +2 -0
  16. package/packages/engine/dist/types/render/frame.d.ts.map +1 -1
  17. package/packages/engine/dist/types/render/renderer.d.ts +2 -0
  18. package/packages/engine/dist/types/render/renderer.d.ts.map +1 -1
  19. package/packages/game/dist/tsconfig.tsbuildinfo +1 -1
  20. package/packages/server/dist/client.d.ts +51 -0
  21. package/packages/server/dist/client.js +100 -0
  22. package/packages/server/dist/dedicated.d.ts +69 -0
  23. package/packages/server/dist/dedicated.js +1013 -0
  24. package/packages/server/dist/index.cjs +27 -2
  25. package/packages/server/dist/index.d.ts +7 -161
  26. package/packages/server/dist/index.js +26 -2
  27. package/packages/server/dist/net/nodeWsDriver.d.ts +16 -0
  28. package/packages/server/dist/net/nodeWsDriver.js +122 -0
  29. package/packages/server/dist/protocol/player.d.ts +23 -0
  30. package/packages/server/dist/protocol/player.js +137 -0
  31. package/packages/server/dist/protocol/write.d.ts +7 -0
  32. package/packages/server/dist/protocol/write.js +167 -0
  33. package/packages/server/dist/protocol.d.ts +17 -0
  34. package/packages/server/dist/protocol.js +71 -0
  35. package/packages/server/dist/server.d.ts +50 -0
  36. package/packages/server/dist/server.js +12 -0
  37. package/packages/server/dist/server.test.d.ts +1 -0
  38. package/packages/server/dist/server.test.js +69 -0
  39. package/packages/server/dist/transport.d.ts +7 -0
  40. package/packages/server/dist/transport.js +1 -0
  41. package/packages/server/dist/transports/websocket.d.ts +11 -0
  42. package/packages/server/dist/transports/websocket.js +38 -0
  43. package/packages/shared/dist/tsconfig.tsbuildinfo +1 -1
  44. package/packages/test-utils/dist/index.cjs +498 -284
  45. package/packages/test-utils/dist/index.cjs.map +1 -1
  46. package/packages/test-utils/dist/index.d.cts +215 -146
  47. package/packages/test-utils/dist/index.d.ts +215 -146
  48. package/packages/test-utils/dist/index.js +488 -278
  49. package/packages/test-utils/dist/index.js.map +1 -1
  50. package/packages/tools/dist/tsconfig.tsbuildinfo +1 -1
  51. package/packages/server/dist/index.d.cts +0 -161
@@ -1,9 +1,12 @@
1
+ import * as vitest from 'vitest';
1
2
  import { Mock } from 'vitest';
2
- import { Vec3, CollisionPlane, CollisionBrush, CollisionNode, CollisionLeaf, CollisionModel, PlayerState, EntityState, createRandomGenerator } from '@quake2ts/shared';
3
+ import { Vec3, CollisionPlane, CollisionBrush, CollisionNode, CollisionLeaf, CollisionModel, PlayerState, EntityState, createRandomGenerator, NetDriver } from '@quake2ts/shared';
3
4
  export { intersects, ladderTrace, stairTrace } from '@quake2ts/shared';
4
5
  import { GameStateSnapshot, Entity, ScriptHookRegistry, SpawnContext, EntitySystem, SpawnRegistry } from '@quake2ts/game';
6
+ import { NetworkTransport, Server, ServerStatic, Client } from '@quake2ts/server';
5
7
  import { ImageData } from '@napi-rs/canvas';
6
- import { Browser, BrowserContext, Page } from 'playwright';
8
+ import { LaunchOptions, BrowserContextOptions, Browser, BrowserContext, Page } from 'playwright';
9
+ import { Server as Server$1 } from 'http';
7
10
 
8
11
  interface BinaryWriterMock {
9
12
  writeByte: Mock<[number], void>;
@@ -129,6 +132,141 @@ declare function createTestContext(options?: {
129
132
  declare function createSpawnContext(): SpawnContext;
130
133
  declare function createEntity(): Entity;
131
134
 
135
+ interface GameState {
136
+ levelName: string;
137
+ time: number;
138
+ entities: Entity[];
139
+ clients: any[];
140
+ }
141
+ /**
142
+ * Creates a mock game state object.
143
+ * @param overrides Optional overrides for the game state.
144
+ */
145
+ declare function createMockGameState(overrides?: Partial<GameState>): GameState;
146
+
147
+ /**
148
+ * Mock implementation of the NetworkTransport interface for server testing.
149
+ * Allows simulating connections and errors.
150
+ */
151
+ declare class MockTransport implements NetworkTransport {
152
+ onConnectionCallback?: (driver: NetDriver, info?: any) => void;
153
+ onErrorCallback?: (error: Error) => void;
154
+ address: string;
155
+ port: number;
156
+ sentMessages: Uint8Array[];
157
+ receivedMessages: Uint8Array[];
158
+ listening: boolean;
159
+ listenSpy: vitest.Mock<any, any>;
160
+ closeSpy: vitest.Mock<any, any>;
161
+ /**
162
+ * Start listening on the specified port.
163
+ */
164
+ listen(port: number): Promise<void>;
165
+ /**
166
+ * Close the transport.
167
+ */
168
+ close(): void;
169
+ /**
170
+ * Register a callback for new connections.
171
+ */
172
+ onConnection(callback: (driver: NetDriver, info?: any) => void): void;
173
+ /**
174
+ * Register a callback for errors.
175
+ */
176
+ onError(callback: (error: Error) => void): void;
177
+ /**
178
+ * Check if the transport is currently listening.
179
+ */
180
+ isListening(): boolean;
181
+ /**
182
+ * Helper to simulate a new connection.
183
+ * @param driver The network driver for the connection.
184
+ * @param info Optional connection info.
185
+ */
186
+ simulateConnection(driver: NetDriver, info?: any): void;
187
+ /**
188
+ * Helper to simulate an error.
189
+ * @param error The error to simulate.
190
+ */
191
+ simulateError(error: Error): void;
192
+ }
193
+ /**
194
+ * Interface for mock UDP socket.
195
+ * This is a partial mock of Node.js dgram.Socket or similar.
196
+ */
197
+ interface MockUDPSocket {
198
+ send: (msg: Uint8Array, offset: number, length: number, port: number, address: string, callback?: (error: Error | null, bytes: number) => void) => void;
199
+ on: (event: string, callback: (...args: any[]) => void) => void;
200
+ close: () => void;
201
+ bind: (port: number, address?: string) => void;
202
+ address: () => {
203
+ address: string;
204
+ family: string;
205
+ port: number;
206
+ };
207
+ }
208
+ /**
209
+ * Creates a mock UDP socket.
210
+ * @param overrides Optional overrides for the socket methods.
211
+ */
212
+ declare function createMockUDPSocket(overrides?: Partial<MockUDPSocket>): MockUDPSocket;
213
+ /**
214
+ * Interface for network address.
215
+ */
216
+ interface NetworkAddress {
217
+ ip: string;
218
+ port: number;
219
+ }
220
+ /**
221
+ * Creates a mock network address.
222
+ * @param ip IP address (default: '127.0.0.1')
223
+ * @param port Port number (default: 27910)
224
+ */
225
+ declare function createMockNetworkAddress(ip?: string, port?: number): NetworkAddress;
226
+ /**
227
+ * Creates a configured MockTransport instance.
228
+ * @param address Address to bind to (default: '127.0.0.1')
229
+ * @param port Port to listen on (default: 27910)
230
+ * @param overrides Optional overrides for the transport properties.
231
+ */
232
+ declare function createMockTransport(address?: string, port?: number, overrides?: Partial<MockTransport>): MockTransport;
233
+
234
+ /**
235
+ * Creates a mock server state object.
236
+ * @param overrides Optional overrides for the server state.
237
+ */
238
+ declare function createMockServerState(overrides?: Partial<Server>): Server;
239
+ /**
240
+ * Creates a mock server static object.
241
+ * @param maxClients Maximum number of clients.
242
+ * @param overrides Optional overrides for the server static state.
243
+ */
244
+ declare function createMockServerStatic(maxClients?: number, overrides?: Partial<ServerStatic>): ServerStatic;
245
+ /**
246
+ * Creates a mock server client.
247
+ * @param clientNum The client index.
248
+ * @param overrides Optional overrides for the client.
249
+ */
250
+ declare function createMockServerClient(clientNum: number, overrides?: Partial<Client>): Client;
251
+ /**
252
+ * Mock interface for the Server class (DedicatedServer).
253
+ * This allows mocking the server instance itself.
254
+ */
255
+ interface MockServer {
256
+ start(mapName: string): Promise<void>;
257
+ stop(): void;
258
+ multicast(origin: any, type: any, event: any, ...args: any[]): void;
259
+ unicast(ent: Entity, reliable: boolean, event: any, ...args: any[]): void;
260
+ configstring(index: number, value: string): void;
261
+ kickPlayer(clientId: number): void;
262
+ changeMap(mapName: string): Promise<void>;
263
+ }
264
+ /**
265
+ * Creates a mock server instance.
266
+ * @param overrides Optional overrides for server methods.
267
+ */
268
+ declare function createMockServer(overrides?: Partial<MockServer>): MockServer;
269
+
132
270
  interface BrowserSetupOptions {
133
271
  url?: string;
134
272
  pretendToBeVisual?: boolean;
@@ -146,14 +284,6 @@ declare function setupBrowserEnvironment(options?: BrowserSetupOptions): void;
146
284
  */
147
285
  declare function teardownBrowserEnvironment(): void;
148
286
 
149
- /**
150
- * Sets up a Node.js environment for testing.
151
- * This is primarily for backend or shared logic that doesn't rely on browser APIs.
152
- */
153
- declare function setupNodeEnvironment(): void;
154
-
155
- declare function createMockWebGL2Context(canvas: HTMLCanvasElement): WebGL2RenderingContext;
156
-
157
287
  interface DrawCall {
158
288
  method: string;
159
289
  args: any[];
@@ -180,39 +310,13 @@ declare function createMockImageData(width: number, height: number, fillColor?:
180
310
  */
181
311
  declare function createMockImage(width?: number, height?: number, src?: string): HTMLImageElement;
182
312
 
183
- interface MockRAF {
184
- tick(timestamp?: number): void;
185
- advance(deltaMs?: number): void;
186
- getCallbacks(): FrameRequestCallback[];
187
- reset(): void;
188
- enable(): void;
189
- disable(): void;
190
- }
191
313
  /**
192
- * Creates a mock implementation of requestAnimationFrame that allows manual control.
193
- * It replaces the global requestAnimationFrame and cancelAnimationFrame.
194
- */
195
- declare function createMockRAF(): MockRAF;
196
- /**
197
- * Creates a mock Performance object with controllable time.
198
- */
199
- declare function createMockPerformance(startTime?: number): Performance;
200
- interface ControlledTimer {
201
- tick(): void;
202
- advanceBy(ms: number): void;
203
- clear(): void;
204
- }
205
- /**
206
- * Helper to simulate multiple frames of a game loop.
207
- * @param count Number of frames to simulate
208
- * @param frameTimeMs Time per frame in milliseconds
209
- * @param callback Optional callback to run inside the loop (e.g. triggering inputs)
210
- */
211
- declare function simulateFrames(count: number, frameTimeMs?: number, callback?: (frameIndex: number) => void): void;
212
- /**
213
- * Simulates frames using a provided MockRAF controller.
314
+ * Sets up a Node.js environment for testing.
315
+ * This is primarily for backend or shared logic that doesn't rely on browser APIs.
214
316
  */
215
- declare function simulateFramesWithMock(mock: MockRAF, count: number, frameTimeMs?: number, callback?: (frameIndex: number) => void): void;
317
+ declare function setupNodeEnvironment(): void;
318
+
319
+ declare function createMockWebGL2Context(canvas: HTMLCanvasElement): WebGL2RenderingContext;
216
320
 
217
321
  /**
218
322
  * Creates a mock Storage implementation (localStorage/sessionStorage).
@@ -259,128 +363,93 @@ interface AudioEvent {
259
363
  */
260
364
  declare function captureAudioEvents(context: AudioContext): AudioEvent[];
261
365
 
262
- declare class MockPointerLock {
263
- static setup(doc: Document): void;
366
+ interface MockRAF {
367
+ tick(timestamp?: number): void;
368
+ advance(deltaMs?: number): void;
369
+ getCallbacks(): FrameRequestCallback[];
370
+ reset(): void;
371
+ enable(): void;
372
+ disable(): void;
264
373
  }
265
- declare class InputInjector {
266
- private doc;
267
- private win;
268
- constructor(doc: Document, win: any);
269
- keyDown(key: string, code?: string): void;
270
- keyUp(key: string, code?: string): void;
271
- mouseMove(movementX: number, movementY: number, clientX?: number, clientY?: number): void;
272
- mouseDown(button?: number): void;
273
- mouseUp(button?: number): void;
274
- wheel(deltaY: number): void;
374
+ /**
375
+ * Creates a mock implementation of requestAnimationFrame that allows manual control.
376
+ * It replaces the global requestAnimationFrame and cancelAnimationFrame.
377
+ */
378
+ declare function createMockRAF(): MockRAF;
379
+ /**
380
+ * Creates a mock Performance object with controllable time.
381
+ */
382
+ declare function createMockPerformance(startTime?: number): Performance;
383
+ interface ControlledTimer {
384
+ tick(): void;
385
+ advanceBy(ms: number): void;
386
+ clear(): void;
387
+ restore(): void;
275
388
  }
389
+ /**
390
+ * Creates a controlled timer that replaces global setTimeout/setInterval.
391
+ * Allows deterministic time advancement.
392
+ */
393
+ declare function createControlledTimer(): ControlledTimer;
394
+ /**
395
+ * Helper to simulate multiple frames of a game loop.
396
+ * @param count Number of frames to simulate
397
+ * @param frameTimeMs Time per frame in milliseconds
398
+ * @param callback Optional callback to run inside the loop (e.g. triggering inputs)
399
+ */
400
+ declare function simulateFrames(count: number, frameTimeMs?: number, callback?: (frameIndex: number) => void): void;
401
+ /**
402
+ * Simulates frames using a provided MockRAF controller.
403
+ */
404
+ declare function simulateFramesWithMock(mock: MockRAF, count: number, frameTimeMs?: number, callback?: (frameIndex: number) => void): void;
276
405
 
406
+ /**
407
+ * Interface for Test Client options
408
+ */
277
409
  interface PlaywrightOptions {
278
410
  headless?: boolean;
279
- viewport?: {
280
- width: number;
281
- height: number;
282
- };
283
- args?: string[];
284
- recordVideo?: {
285
- dir: string;
286
- size?: {
287
- width: number;
288
- height: number;
289
- };
290
- };
411
+ width?: number;
412
+ height?: number;
413
+ clientUrl?: string;
414
+ serverUrl?: string;
415
+ rootPath?: string;
416
+ launchOptions?: LaunchOptions;
417
+ contextOptions?: BrowserContextOptions;
291
418
  }
292
419
  interface PlaywrightTestClient {
293
420
  browser: Browser;
294
421
  context: BrowserContext;
295
422
  page: Page;
296
- navigate(url: string): Promise<void>;
297
- waitForGame(timeout?: number): Promise<void>;
298
- injectInput(type: 'keydown' | 'keyup', key: string): Promise<void>;
299
- injectMouse(type: 'move' | 'down' | 'up', x?: number, y?: number, button?: number): Promise<void>;
300
- screenshot(path: string): Promise<void>;
301
- close(): Promise<void>;
302
- }
303
- interface GameStateCapture {
304
- origin?: {
305
- x: number;
306
- y: number;
307
- z: number;
308
- };
309
- angles?: {
310
- x: number;
311
- y: number;
312
- z: number;
313
- };
314
- health?: number;
423
+ server?: Server$1;
424
+ close: () => Promise<void>;
425
+ navigate: (url?: string) => Promise<void>;
426
+ waitForGame: (timeout?: number) => Promise<void>;
427
+ injectInput: (type: string, data: any) => Promise<void>;
315
428
  }
316
429
  /**
317
- * Creates a Playwright test client wrapper.
430
+ * Creates a Playwright-controlled browser environment for testing.
431
+ * Can start a static server to serve the game client if no clientUrl is provided.
318
432
  */
319
433
  declare function createPlaywrightTestClient(options?: PlaywrightOptions): Promise<PlaywrightTestClient>;
320
- /**
321
- * Waits for the game to be ready on the provided page.
322
- */
323
434
  declare function waitForGameReady(page: Page, timeout?: number): Promise<void>;
324
- /**
325
- * Captures the current game state from the browser.
326
- * Requires the game to expose state globally (e.g. window.game.state).
327
- */
328
- declare function captureGameState(page: Page): Promise<GameStateCapture>;
329
-
330
- interface NetworkSimulator {
331
- apply(page: any): Promise<void>;
332
- clear(page: any): Promise<void>;
333
- }
334
- type NetworkCondition = 'good' | 'slow' | 'unstable' | 'offline';
335
- interface NetworkConfig {
336
- offline: boolean;
337
- downloadThroughput: number;
338
- uploadThroughput: number;
339
- latency: number;
435
+ interface GameStateCapture {
436
+ [key: string]: any;
340
437
  }
341
- /**
342
- * Simulates network conditions using Chrome DevTools Protocol (CDP) via Playwright.
343
- */
344
- declare function simulateNetworkCondition(condition: NetworkCondition): NetworkSimulator;
345
- /**
346
- * Creates a custom network condition simulator.
347
- *
348
- * @param latency Latency in milliseconds
349
- * @param jitter Approximate jitter (variation in latency) - Note: CDP doesn't support jitter natively, so this is just a placeholder or requires manual delay injection.
350
- * @param packetLoss Packet loss percentage (0-100) - CDP doesn't strictly support packet loss, typically emulated via "offline" toggling or proxy. We will ignore for basic CDP emulation.
351
- */
352
- declare function createCustomNetworkCondition(latency: number, jitter?: number, packetLoss?: number, baseConfig?: NetworkConfig): NetworkSimulator;
353
- /**
354
- * Throttles bandwidth for the given page.
355
- */
356
- declare function throttleBandwidth(page: any, bytesPerSecond: number): Promise<void>;
438
+ declare function captureGameState(page: Page): Promise<GameStateCapture>;
357
439
 
358
- interface VisualDiff {
359
- pixelDiff: number;
360
- diffPath?: string;
361
- matched: boolean;
440
+ declare class MockPointerLock {
441
+ static setup(doc: Document): void;
362
442
  }
363
- /**
364
- * Captures a screenshot of the current game state.
365
- */
366
- declare function captureGameScreenshot(page: Page, name: string, options?: {
367
- dir?: string;
368
- fullPage?: boolean;
369
- }): Promise<Buffer>;
370
- /**
371
- * Compares two image buffers pixel-by-pixel.
372
- * Note: A robust implementation would use a library like 'pixelmatch' or 'looks-same'.
373
- * For now, we provide a basic placeholder or rely on simple buffer comparison if strict equality is needed,
374
- * but visual regression usually requires tolerance.
375
- */
376
- declare function compareScreenshots(baseline: Buffer, current: Buffer, threshold?: number): Promise<VisualDiff>;
377
- interface VisualScenario {
378
- capture(name: string): Promise<Buffer>;
379
- compare(name: string, baselineDir: string): Promise<VisualDiff>;
443
+ declare class InputInjector {
444
+ private doc;
445
+ private win;
446
+ constructor(doc: Document, win: any);
447
+ keyDown(key: string, code?: string): void;
448
+ keyUp(key: string, code?: string): void;
449
+ mouseMove(movementX: number, movementY: number, clientX?: number, clientY?: number): void;
450
+ mouseDown(button?: number): void;
451
+ mouseUp(button?: number): void;
452
+ wheel(deltaY: number): void;
380
453
  }
381
- /**
382
- * Creates a helper for visual regression testing scenarios.
383
- */
384
- declare function createVisualTestScenario(page: Page, sceneName: string): VisualScenario;
385
454
 
386
- export { type AudioEvent, type BinaryStreamMock, type BinaryWriterMock, type BrowserSetupOptions, type ControlledTimer, type DrawCall, type GameStateCapture, InputInjector, type MockEngine, type MockGame, MockPointerLock, type MockRAF, type NetworkCondition, type NetworkConfig, type NetworkSimulator, type PlaywrightOptions, type PlaywrightTestClient, type StorageScenario, type TestContext, type VisualDiff, type VisualScenario, captureAudioEvents, captureCanvasDrawCalls, captureGameScreenshot, captureGameState, compareScreenshots, createBinaryStreamMock, createBinaryWriterMock, createCustomNetworkCondition, createEntity, createEntityStateFactory, createGameStateSnapshotFactory, createMockAudioContext, createMockCanvas, createMockCanvasContext2D, createMockEngine, createMockGame, createMockImage, createMockImageData, createMockIndexedDB, createMockLocalStorage, createMockPerformance, createMockRAF, createMockSessionStorage, createMockWebGL2Context, createNetChanMock, createPlayerStateFactory, createPlaywrightTestClient, createSpawnContext, createStorageTestScenario, createTestContext, createVisualTestScenario, makeAxisBrush, makeBrushFromMinsMaxs, makeBspModel, makeLeaf, makeLeafModel, makeNode, makePlane, setupBrowserEnvironment, setupMockAudioContext, setupNodeEnvironment, simulateFrames, simulateFramesWithMock, simulateNetworkCondition, teardownBrowserEnvironment, teardownMockAudioContext, throttleBandwidth, waitForGameReady };
455
+ export { type AudioEvent, type BinaryStreamMock, type BinaryWriterMock, type BrowserSetupOptions, type ControlledTimer, type DrawCall, type GameState, type GameStateCapture, InputInjector, type MockEngine, type MockGame, MockPointerLock, type MockRAF, type MockServer, MockTransport, type MockUDPSocket, type NetworkAddress, type PlaywrightOptions, type PlaywrightTestClient, type StorageScenario, type TestContext, captureAudioEvents, captureCanvasDrawCalls, captureGameState, createBinaryStreamMock, createBinaryWriterMock, createControlledTimer, createEntity, createEntityStateFactory, createGameStateSnapshotFactory, createMockAudioContext, createMockCanvas, createMockCanvasContext2D, createMockEngine, createMockGame, createMockGameState, createMockImage, createMockImageData, createMockIndexedDB, createMockLocalStorage, createMockNetworkAddress, createMockPerformance, createMockRAF, createMockServer, createMockServerClient, createMockServerState, createMockServerStatic, createMockSessionStorage, createMockTransport, createMockUDPSocket, createMockWebGL2Context, createNetChanMock, createPlayerStateFactory, createPlaywrightTestClient, createSpawnContext, createStorageTestScenario, createTestContext, makeAxisBrush, makeBrushFromMinsMaxs, makeBspModel, makeLeaf, makeLeafModel, makeNode, makePlane, setupBrowserEnvironment, setupMockAudioContext, setupNodeEnvironment, simulateFrames, simulateFramesWithMock, teardownBrowserEnvironment, teardownMockAudioContext, waitForGameReady };