v0.59.0: SSE frames drop terminal package history (sseFrame projection) — ~597 KB → ~10 KB per frame (#133)
CI / build + unit + e2e (pull_request) Successful in 17m7s

This commit is contained in:
2026-09-23 05:49:17 +00:00
parent c5413aff65
commit 6a819b8d5a
7 changed files with 105 additions and 11 deletions
+6 -5
View File
@@ -7,7 +7,7 @@ import { haversineKm, initialBearingDeg } from '@/lib/geo';
import { weatherFor } from '@/lib/weather';
import { FUEL_DISCOUNT_PER_REP, FUEL_PRICE_PER_L, MAX_FUEL_DISCOUNT, PLANE_TYPES, REPAIR_DURATION_MS, repRate, WEAR_PER_KM } from '@/lib/game/catalog';
import { SPECIALS } from '@/lib/game/specials';
import { getStateSnapshot, parseIcaoQueue } from '@/lib/game/state';
import { getStateSnapshot, parseIcaoQueue, sseFrame } from '@/lib/game/state';
import { broadcast } from '@/lib/sse';
import { IDLE_WORLD_TIME_SCALE } from '@/lib/worldClock';
import {
@@ -420,12 +420,13 @@ export async function spawnCoveragePackages(
// --- Public API (singleton DB + lock) — call from every read/action endpoint ---
// ISS-129 (v0.57.0): after each tick on the singleton path, push a fresh snapshot to all SSE
// subscribers (/api/events) — the exact same body GET /api/state returns (getStateSnapshot), so
// pushed and polled states can never diverge in shape. Failures are logged, not fatal: polling
// still works either way. Background ticks (~1 s) cover action mutations for other clients too.
// subscribers (/api/events). ISS-133 (v0.59.0): frames carry the sseFrame projection — terminal
// package history is dropped, everything else matches GET /api/state exactly. Failures are logged,
// not fatal: polling still works either way. Background ticks (~1 s) cover action mutations for
// other clients too.
async function broadcastState(): Promise<void> {
try {
broadcast(JSON.stringify(await getStateSnapshot()));
broadcast(JSON.stringify(sseFrame(await getStateSnapshot())));
} catch (err) {
console.error('flight: state broadcast failed', err);
}