Prepare game updates and single-process PM2 deployment
This commit is contained in:
@@ -14,15 +14,26 @@ import { registerAnalyticsApi, registerGameApi, registerRoomApi } from './game-a
|
||||
import { registerSignaling, type RtcServerOptions } from './signaling.js';
|
||||
import { createRankedService } from './ranked-service.js';
|
||||
import { registerRankedApi } from './ranked-api.js';
|
||||
export interface ServerOptions { mongoUri: string; databaseName: string; clientDirectory: string; clock?: Clock; adminUser?: string; adminPassword?: string; environment?: 'production' | 'test'; rtc?: RtcServerOptions }
|
||||
import { createGlobalSettingsStore } from './global-settings.js';
|
||||
import { gameRoute } from './game-api.js';
|
||||
import { createHttpOptions, registerHttpOperations, logSafeError } from './http-operations.js';
|
||||
export interface ServerOptions { mongoUri: string; databaseName: string; clientDirectory: string; clock?: Clock; adminUser?: string; adminPassword?: string; environment?: 'production' | 'test'; rtc?: RtcServerOptions; trustProxy?: false | string[]; logLevel?: string }
|
||||
export async function createGameServer(options: ServerOptions): Promise<FastifyInstance> {
|
||||
const store = await createStatsStore(options);
|
||||
const app = Fastify({ logger: false, bodyLimit: 16384 });
|
||||
const app = Fastify(createHttpOptions(options));
|
||||
const io = new Server(app.server, { maxHttpBufferSize: 16384 });
|
||||
const clock = options.clock ?? systemClock;
|
||||
registerHttpOperations(app, { now: () => clock.now(), ready: () => store.db.command({ ping: 1 }, { timeoutMS: 3000 }) });
|
||||
const settings = createGlobalSettingsStore(store.db);
|
||||
await settings.initialize();
|
||||
gameRoute(app, 'GET', '/api/global-settings', async request => {
|
||||
const current = await settings.get();
|
||||
return Number((request.query as { revision?: string }).revision) === current.revision
|
||||
? { revision: current.revision } : { revision: current.revision, settings: current };
|
||||
});
|
||||
const gameSessions = await createGameSessionStore(store.db, () => clock.now(), options.environment ?? 'production');
|
||||
const peerRooms = await createRoomStore(store.db, () => clock.now());
|
||||
const ranked = await createRankedService(store.db, clock, options.environment ?? 'production');
|
||||
const ranked = await createRankedService(store.db, clock, options.environment ?? 'production', () => logSafeError(app.log, 'ranked_background', undefined));
|
||||
const signaling = registerSignaling(io, gameSessions, peerRooms, options.rtc, () => clock.now());
|
||||
registerGameApi(app, gameSessions, store, ranked);
|
||||
registerRoomApi(app, gameSessions, peerRooms, signaling, ranked);
|
||||
@@ -43,7 +54,7 @@ export async function createGameServer(options: ServerOptions): Promise<FastifyI
|
||||
return reply.sendFile(`assets/${path}`);
|
||||
});
|
||||
}
|
||||
registerAdmin(app, store, analytics, clock, { user: options.adminUser, password: options.adminPassword }, directory);
|
||||
registerAdmin(app, store, analytics, clock, { user: options.adminUser, password: options.adminPassword }, directory, settings);
|
||||
app.addHook('preClose', async () => {
|
||||
await ranked.close();
|
||||
await analytics.close();
|
||||
|
||||
Reference in New Issue
Block a user