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
CI / build + unit + e2e (pull_request) Successful in 17m7s
This commit is contained in:
@@ -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']);
|
||||
});
|
||||
});
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user