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
+61
View File
@@ -0,0 +1,61 @@
import { describe, expect, it } from 'vitest';
import { SSE_PACKAGE_STATUSES, sseFrame, type PackageState, type StateSnapshot } from './state';
// ISS-133 (v0.59.0) — the SSE projection keeps only the package statuses any component renders.
const pkg = (status: PackageState['status'], id: string): PackageState => ({
id,
originIcao: 'LEMD',
originName: 'Madrid–Barajas',
destIcao: 'EHAM',
destName: 'Amsterdam Schiphol',
reward: 1000,
cargoType: 'mail',
cargoCount: 3,
weightKg: 900,
special: null,
distanceKm: 2000,
deadlineSimTime: 1_000_000,
status,
planeId: null,
createdSimTime: 0,
});
const snapshot = (packages: PackageState[]): StateSnapshot => ({
account: { cash: 20_000, reputation: 1 },
simState: { clockMs: 42 },
catalog: [],
fuelPricePerL: 0.8,
sellFraction: 0.5,
planes: [],
packages,
});
describe('sseFrame', () => {
it('keeps exactly the open/loaded/expired packages and drops terminal history', () => {
const all = [
pkg('open', 'p-open'),
pkg('delivered', 'p-delivered'),
pkg('loaded', 'p-loaded'),
pkg('abandoned', 'p-abandoned'),
pkg('expired', 'p-expired'),
pkg('ignored', 'p-ignored'),
];
const frame = sseFrame(snapshot(all));
expect(frame.packages.map((p) => p.id)).toEqual(['p-open', 'p-loaded', 'p-expired']);
});
it('passes the rest of the snapshot through untouched and does not mutate its input', () => {
const all = [pkg('open', 'a'), pkg('delivered', 'b')];
const snap = snapshot(all);
const frame = sseFrame(snap);
expect(frame.account).toEqual({ cash: 20_000, reputation: 1 });
expect(frame.simState).toEqual({ clockMs: 42 });
expect(frame.planes).toEqual([]);
expect(all.map((p) => p.status)).toContain('delivered'); // input intact
});
it('SSE_PACKAGE_STATUSES matches what the client renders (open market, on-board cargo)', () => {
expect([...SSE_PACKAGE_STATUSES].sort()).toEqual(['expired', 'loaded', 'open']);
});
});
+10
View File
@@ -85,6 +85,16 @@ export interface StateSnapshot {
sellFraction: number;
}
// ISS-133 (v0.59.0): the SSE projection of a snapshot — only the package statuses any component
// renders: open (market list), loaded + expired (on-board cargo, which keeps its payload slot).
// Terminal history (delivered/abandoned/ignored) is unbounded in the DB and never read by the
// client, so it stays out of every pushed frame; /api/state and action responses keep the full set.
export const SSE_PACKAGE_STATUSES = ['open', 'loaded', 'expired'] as const;
export function sseFrame(snapshot: StateSnapshot): StateSnapshot {
return { ...snapshot, packages: snapshot.packages.filter((p) => (SSE_PACKAGE_STATUSES as readonly string[]).includes(p.status)) };
}
export async function getStateSnapshot(): Promise<StateSnapshot> {
const { db } = await getGameDb();
// NOTE: use plain select(), not the relational db.query.* API — in drizzle-orm