quake2ts 0.0.573 → 0.0.575

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 (34) hide show
  1. package/package.json +1 -1
  2. package/packages/client/dist/browser/index.global.js.map +1 -1
  3. package/packages/client/dist/cjs/index.cjs +2 -2
  4. package/packages/client/dist/cjs/index.cjs.map +1 -1
  5. package/packages/client/dist/esm/index.js +2 -2
  6. package/packages/client/dist/esm/index.js.map +1 -1
  7. package/packages/client/dist/tsconfig.tsbuildinfo +1 -1
  8. package/packages/engine/dist/browser/index.global.js +16 -16
  9. package/packages/engine/dist/browser/index.global.js.map +1 -1
  10. package/packages/engine/dist/cjs/index.cjs +123 -14
  11. package/packages/engine/dist/cjs/index.cjs.map +1 -1
  12. package/packages/engine/dist/esm/index.js +122 -14
  13. package/packages/engine/dist/esm/index.js.map +1 -1
  14. package/packages/engine/dist/tsconfig.tsbuildinfo +1 -1
  15. package/packages/engine/dist/types/index.d.ts +1 -0
  16. package/packages/engine/dist/types/index.d.ts.map +1 -1
  17. package/packages/game/dist/tsconfig.tsbuildinfo +1 -1
  18. package/packages/test-utils/dist/index.cjs +133 -0
  19. package/packages/test-utils/dist/index.cjs.map +1 -1
  20. package/packages/test-utils/dist/index.d.cts +84 -2
  21. package/packages/test-utils/dist/index.d.ts +84 -2
  22. package/packages/test-utils/dist/index.js +126 -0
  23. package/packages/test-utils/dist/index.js.map +1 -1
  24. package/packages/tools/dist/browser/index.global.js +2 -1
  25. package/packages/tools/dist/browser/index.global.js.map +1 -1
  26. package/packages/tools/dist/cjs/index.cjs +175 -2
  27. package/packages/tools/dist/cjs/index.cjs.map +1 -1
  28. package/packages/tools/dist/esm/index.js +170 -1
  29. package/packages/tools/dist/esm/index.js.map +1 -1
  30. package/packages/tools/dist/tsconfig.tsbuildinfo +1 -1
  31. package/packages/tools/dist/types/index.d.ts +1 -0
  32. package/packages/tools/dist/types/index.d.ts.map +1 -1
  33. package/packages/tools/dist/types/modelExport.d.ts +19 -0
  34. package/packages/tools/dist/types/modelExport.d.ts.map +1 -0
@@ -39,6 +39,7 @@ __export(index_exports, {
39
39
  captureGameScreenshot: () => captureGameScreenshot,
40
40
  captureGameState: () => captureGameState,
41
41
  compareScreenshots: () => compareScreenshots,
42
+ createBandwidthTestScenario: () => createBandwidthTestScenario,
42
43
  createBinaryStreamMock: () => createBinaryStreamMock,
43
44
  createBinaryWriterMock: () => createBinaryWriterMock,
44
45
  createCombatTestContext: () => createCombatTestContext,
@@ -73,6 +74,7 @@ __export(index_exports, {
73
74
  createMockInventory: () => createMockInventory,
74
75
  createMockItem: () => createMockItem,
75
76
  createMockLocalStorage: () => createMockLocalStorage,
77
+ createMockMasterServer: () => createMockMasterServer,
76
78
  createMockMonsterAI: () => createMockMonsterAI,
77
79
  createMockMonsterMove: () => createMockMonsterMove,
78
80
  createMockNetDriver: () => createMockNetDriver,
@@ -81,9 +83,11 @@ __export(index_exports, {
81
83
  createMockPowerupItem: () => createMockPowerupItem,
82
84
  createMockRAF: () => createMockRAF,
83
85
  createMockRConClient: () => createMockRConClient,
86
+ createMockRateLimiter: () => createMockRateLimiter,
84
87
  createMockServer: () => createMockServer,
85
88
  createMockServerClient: () => createMockServerClient,
86
89
  createMockServerConsole: () => createMockServerConsole,
90
+ createMockServerInfo: () => createMockServerInfo,
87
91
  createMockServerState: () => createMockServerState,
88
92
  createMockServerStatic: () => createMockServerStatic,
89
93
  createMockSessionStorage: () => createMockSessionStorage,
@@ -116,12 +120,14 @@ __export(index_exports, {
116
120
  makeLeafModel: () => makeLeafModel,
117
121
  makeNode: () => makeNode,
118
122
  makePlane: () => makePlane,
123
+ measureSnapshotSize: () => measureSnapshotSize,
119
124
  mockMonsterAttacks: () => mockMonsterAttacks,
120
125
  serializeUserInfo: () => serializeUserInfo,
121
126
  setupBrowserEnvironment: () => setupBrowserEnvironment,
122
127
  setupMockAudioContext: () => setupMockAudioContext,
123
128
  setupNodeEnvironment: () => setupNodeEnvironment,
124
129
  setupWebGPUMocks: () => setupWebGPUMocks,
130
+ simulateBandwidthLimit: () => simulateBandwidthLimit,
125
131
  simulateFrames: () => simulateFrames,
126
132
  simulateFramesWithMock: () => simulateFramesWithMock,
127
133
  simulateHandshake: () => simulateHandshake,
@@ -130,6 +136,7 @@ __export(index_exports, {
130
136
  simulatePlayerJoin: () => simulatePlayerJoin,
131
137
  simulatePlayerLeave: () => simulatePlayerLeave,
132
138
  simulateServerCommand: () => simulateServerCommand,
139
+ simulateServerRegistration: () => simulateServerRegistration,
133
140
  simulateServerTick: () => simulateServerTick,
134
141
  simulateSnapshotDelivery: () => simulateSnapshotDelivery,
135
142
  stairTrace: () => import_shared3.stairTrace,
@@ -1192,6 +1199,60 @@ function simulateServerCommand(server, command) {
1192
1199
  return "Unknown command handler";
1193
1200
  }
1194
1201
 
1202
+ // src/server/mocks/master.ts
1203
+ function createMockMasterServer(overrides = {}) {
1204
+ const servers = /* @__PURE__ */ new Map();
1205
+ return {
1206
+ registerServer: async (info) => {
1207
+ servers.set(info.address, info);
1208
+ return true;
1209
+ },
1210
+ heartbeat: async (serverAddress) => {
1211
+ return servers.has(serverAddress);
1212
+ },
1213
+ getServerList: async (filter) => {
1214
+ let list = Array.from(servers.values());
1215
+ if (filter) {
1216
+ if (filter.gametype) {
1217
+ list = list.filter((s) => s.gametype === filter.gametype);
1218
+ }
1219
+ if (filter.map) {
1220
+ list = list.filter((s) => s.map === filter.map);
1221
+ }
1222
+ if (filter.notEmpty) {
1223
+ list = list.filter((s) => s.players > 0);
1224
+ }
1225
+ if (filter.notFull) {
1226
+ list = list.filter((s) => s.players < s.maxPlayers);
1227
+ }
1228
+ }
1229
+ return list;
1230
+ },
1231
+ ...overrides
1232
+ };
1233
+ }
1234
+ function createMockServerInfo(overrides = {}) {
1235
+ return {
1236
+ address: "127.0.0.1:27910",
1237
+ name: "Quake 2 Test Server",
1238
+ map: "q2dm1",
1239
+ players: 0,
1240
+ maxPlayers: 16,
1241
+ gametype: "deathmatch",
1242
+ version: "1.0",
1243
+ ...overrides
1244
+ };
1245
+ }
1246
+ async function simulateServerRegistration(server, master) {
1247
+ const info = createMockServerInfo({
1248
+ name: server.name || "Test Server",
1249
+ map: server.mapName || "q2dm1",
1250
+ players: server.clients ? server.clients.filter((c) => c && c.state >= 2).length : 0,
1251
+ maxPlayers: server.maxClients || 16
1252
+ });
1253
+ return master.registerServer(info);
1254
+ }
1255
+
1195
1256
  // src/server/helpers/multiplayer.ts
1196
1257
  var import_server3 = require("@quake2ts/server");
1197
1258
  function createMultiplayerTestScenario(numPlayers = 2) {
@@ -1344,6 +1405,71 @@ async function simulateSnapshotDelivery(snapshot, reliability = 1) {
1344
1405
  return snapshot;
1345
1406
  }
1346
1407
 
1408
+ // src/server/helpers/bandwidth.ts
1409
+ function createMockRateLimiter(bytesPerSecond) {
1410
+ let bucket = bytesPerSecond;
1411
+ const maxBucket = bytesPerSecond;
1412
+ let usage = 0;
1413
+ return {
1414
+ bytesPerSecond,
1415
+ allow(bytes) {
1416
+ if (bucket >= bytes) {
1417
+ bucket -= bytes;
1418
+ usage += bytes;
1419
+ return true;
1420
+ }
1421
+ return false;
1422
+ },
1423
+ update(deltaSeconds) {
1424
+ bucket += bytesPerSecond * deltaSeconds;
1425
+ if (bucket > maxBucket) {
1426
+ bucket = maxBucket;
1427
+ }
1428
+ },
1429
+ reset() {
1430
+ bucket = maxBucket;
1431
+ usage = 0;
1432
+ },
1433
+ getUsage() {
1434
+ return usage;
1435
+ }
1436
+ };
1437
+ }
1438
+ function simulateBandwidthLimit(messages, bandwidth) {
1439
+ const limiter = createMockRateLimiter(bandwidth);
1440
+ const result = [];
1441
+ let lastTime = messages.length > 0 ? messages[0].timestamp : 0;
1442
+ for (const msg of messages) {
1443
+ const delta = (msg.timestamp - lastTime) / 1e3;
1444
+ if (delta > 0) {
1445
+ limiter.update(delta);
1446
+ }
1447
+ lastTime = msg.timestamp;
1448
+ if (limiter.allow(msg.size)) {
1449
+ result.push(msg);
1450
+ }
1451
+ }
1452
+ return result;
1453
+ }
1454
+ function measureSnapshotSize(snapshot) {
1455
+ let size = 0;
1456
+ size += snapshot.areaBytes;
1457
+ size += 200;
1458
+ size += snapshot.entities.length * 20;
1459
+ return size;
1460
+ }
1461
+ function createBandwidthTestScenario(bandwidth, numClients) {
1462
+ const clients = [];
1463
+ return {
1464
+ bandwidth,
1465
+ clients,
1466
+ duration: 0,
1467
+ totalBytesSent: 0,
1468
+ totalBytesReceived: 0,
1469
+ droppedPackets: 0
1470
+ };
1471
+ }
1472
+
1347
1473
  // src/setup/browser.ts
1348
1474
  var import_jsdom = require("jsdom");
1349
1475
  var import_canvas = require("@napi-rs/canvas");
@@ -2482,6 +2608,7 @@ function createVisualTestScenario(page, sceneName) {
2482
2608
  captureGameScreenshot,
2483
2609
  captureGameState,
2484
2610
  compareScreenshots,
2611
+ createBandwidthTestScenario,
2485
2612
  createBinaryStreamMock,
2486
2613
  createBinaryWriterMock,
2487
2614
  createCombatTestContext,
@@ -2516,6 +2643,7 @@ function createVisualTestScenario(page, sceneName) {
2516
2643
  createMockInventory,
2517
2644
  createMockItem,
2518
2645
  createMockLocalStorage,
2646
+ createMockMasterServer,
2519
2647
  createMockMonsterAI,
2520
2648
  createMockMonsterMove,
2521
2649
  createMockNetDriver,
@@ -2524,9 +2652,11 @@ function createVisualTestScenario(page, sceneName) {
2524
2652
  createMockPowerupItem,
2525
2653
  createMockRAF,
2526
2654
  createMockRConClient,
2655
+ createMockRateLimiter,
2527
2656
  createMockServer,
2528
2657
  createMockServerClient,
2529
2658
  createMockServerConsole,
2659
+ createMockServerInfo,
2530
2660
  createMockServerState,
2531
2661
  createMockServerStatic,
2532
2662
  createMockSessionStorage,
@@ -2559,12 +2689,14 @@ function createVisualTestScenario(page, sceneName) {
2559
2689
  makeLeafModel,
2560
2690
  makeNode,
2561
2691
  makePlane,
2692
+ measureSnapshotSize,
2562
2693
  mockMonsterAttacks,
2563
2694
  serializeUserInfo,
2564
2695
  setupBrowserEnvironment,
2565
2696
  setupMockAudioContext,
2566
2697
  setupNodeEnvironment,
2567
2698
  setupWebGPUMocks,
2699
+ simulateBandwidthLimit,
2568
2700
  simulateFrames,
2569
2701
  simulateFramesWithMock,
2570
2702
  simulateHandshake,
@@ -2573,6 +2705,7 @@ function createVisualTestScenario(page, sceneName) {
2573
2705
  simulatePlayerJoin,
2574
2706
  simulatePlayerLeave,
2575
2707
  simulateServerCommand,
2708
+ simulateServerRegistration,
2576
2709
  simulateServerTick,
2577
2710
  simulateSnapshotDelivery,
2578
2711
  stairTrace,