Files
uberwald 5ba7717ecd Fix Story 1.3: StateStore spec compliance and minor cleanup
Critical Fix:
- StateStore now uses global Hooks.callAll directly (per spec)
- Removed hooks parameter from StateStore constructor
- Updated module.js to pass only adapter.settings
- Updated tests to stub globalThis.Hooks

Minor Cleanup:
- Fixed misleading warning in SocketHandler.registerPendingOp
- Added clarifying comment for setMatrix _revision behavior

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-22 11:38:45 +02:00

127 lines
4.3 KiB
JavaScript

/**
* tests/fixtures/socket-payloads.js
*
* Socket payload fixtures — frozen; include valid and invalid variants.
* Used by socket-message contract tests and SocketHandler tests.
*
* All exports are Object.freeze'd — never mutate fixture data in tests.
*/
export const SOCKET_PAYLOADS = Object.freeze({
// ── Valid intent (GM → all clients) ──────────────────────────────────────
validIntent: Object.freeze({
event: "scrying-pool.visibility.set",
payload: Object.freeze({
opId: "op-001",
userId: "user-abc",
targetState: "hidden",
baseRevision: 0,
}),
}),
// ── Valid echo (broadcast ← GM) ───────────────────────────────────────────
validEcho: Object.freeze({
event: "scrying-pool.visibility.updated",
payload: Object.freeze({
opId: "op-001",
userId: "user-abc",
state: "hidden",
revision: 1,
}),
}),
// ── Malformed: missing opId ───────────────────────────────────────────────
missingOpId: Object.freeze({
event: "scrying-pool.visibility.set",
payload: Object.freeze({
userId: "user-abc",
targetState: "hidden",
baseRevision: 0,
// opId intentionally omitted
}),
}),
// ── Malformed: wrong enum value for targetState ───────────────────────────
invalidState: Object.freeze({
event: "scrying-pool.visibility.set",
payload: Object.freeze({
opId: "op-002",
userId: "user-abc",
targetState: "invisible", // not a valid VisibilityState
baseRevision: 0,
}),
}),
// ── Malformed: extra unknown keys in payload ──────────────────────────────
extraKeys: Object.freeze({
event: "scrying-pool.visibility.set",
payload: Object.freeze({
opId: "op-003",
userId: "user-abc",
targetState: "hidden",
baseRevision: 0,
extraField: "should-not-be-here",
}),
}),
// ── Malformed: unknown event name ─────────────────────────────────────────
unknownEvent: Object.freeze({
event: "sp:stateChange", // violates naming convention
payload: Object.freeze({ opId: "op-004", userId: "user-abc" }),
}),
// ── Malformed: echo message missing revision field ───────────────────────
missingRevision: Object.freeze({
event: "scrying-pool.visibility.updated",
payload: Object.freeze({
opId: "op-005",
userId: "user-abc",
state: "hidden",
// revision intentionally omitted
}),
}),
// ── Stale ACK — opId not in pendingOps ───────────────────────────────────
staleEcho: Object.freeze({
event: "scrying-pool.visibility.updated",
payload: Object.freeze({
opId: "op-stale-999", // not registered in any pendingOps map
userId: "user-abc",
state: "hidden",
revision: 5,
}),
}),
// ── Timeout/retry sequence: intent that will time out ────────────────────
timeoutIntent: Object.freeze({
event: "scrying-pool.visibility.set",
payload: Object.freeze({
opId: "op-timeout-001",
userId: "user-abc",
targetState: "hidden",
baseRevision: 0,
}),
}),
// ── Hydration payload (persisted world setting shape) ────────────────────
hydrationPayload: Object.freeze({
_version: 1,
matrix: Object.freeze({
"user-001": "active",
"user-002": "hidden",
}),
}),
// ── Malformed: missing baseRevision in intent ─────────────────────────────
missingBaseRevision: Object.freeze({
event: "scrying-pool.visibility.set",
payload: Object.freeze({
opId: "op-006",
userId: "user-abc",
targetState: "hidden",
// baseRevision intentionally omitted
}),
}),
});