Files
ssessesse-ki-battle/tests/webrtc-load-server.ts
T

26 lines
1.8 KiB
TypeScript

// Isolated load fixture; never imported by the production server.
import { Collection } from 'mongodb';
import { createGameServer } from '../src/server/create-server.js';
const databaseName = process.env.LOAD_DATABASE!;
if (!/^dragon_ball_test_load_[a-f0-9]+$/.test(databaseName)) throw new Error('TEST_DATABASE_REQUIRED');
const writes: Record<string, number> = {};
for (const name of ['insertOne', 'updateOne', 'updateMany', 'findOneAndUpdate'] as const) {
const original = Collection.prototype[name] as Function;
(Collection.prototype as any)[name] = function (...args: unknown[]) {
const key = `${this.collectionName}.${name}`; writes[key] = (writes[key] ?? 0) + 1;
return original.apply(this, args);
};
}
const app = await createGameServer({ mongoUri: process.env.TEST_MONGODB_URI!, databaseName, clientDirectory: '.superpowers/missing-load-client', environment: 'test' });
const sockets = new Set<unknown>(); let peakSockets = 0;
app.server.on('upgrade', (_request, socket) => { sockets.add(socket); peakSockets = Math.max(peakSockets, sockets.size); socket.once('close', () => sockets.delete(socket)); });
let previous = process.cpuUsage(), at = performance.now();
const metrics = setInterval(() => {
const next = performance.now(), usage = process.cpuUsage(), delta = next - at;
process.send?.({ type: 'metrics', rss: process.memoryUsage().rss, cpuPercent: ((usage.user - previous.user) + (usage.system - previous.system)) / (delta * 1000) * 100,
sockets: sockets.size, peakSockets, writes });
previous = usage; at = next;
}, 1000);
process.send?.({ type: 'ready', url: await app.listen({ port: 0, host: '127.0.0.1' }) });
process.on('message', message => { if (message === 'stop') void (async () => { clearInterval(metrics); await app.close(); process.exit(0); })(); });