// FlatBuffers payload builders for the Phase 14 Playwright suite. // Mirrors what `pkg/transcoder/order.go` produces in production for // the `user.games.order` POST response and the // `user.games.order.get` GET response. import { Builder } from "flatbuffers"; import { uuidToHiLo } from "../../../src/api/game-state"; import { UUID } from "../../../src/proto/galaxy/fbs/common"; import { CommandItem, CommandPayload, CommandPlanetRename, UserGamesOrder, UserGamesOrderGetResponse, UserGamesOrderResponse, } from "../../../src/proto/galaxy/fbs/order"; export interface CommandResultFixture { cmdId: string; planetNumber: number; name: string; applied: boolean | null; errorCode: number | null; } export function buildOrderResponsePayload( gameId: string, commands: CommandResultFixture[], updatedAt: number, ): Uint8Array { const builder = new Builder(256); const itemOffsets = commands.map((c) => encodeItem(builder, c)); const commandsVec = UserGamesOrderResponse.createCommandsVector( builder, itemOffsets, ); const [hi, lo] = uuidToHiLo(gameId); const gameIdOffset = UUID.createUUID(builder, hi, lo); UserGamesOrderResponse.startUserGamesOrderResponse(builder); UserGamesOrderResponse.addGameId(builder, gameIdOffset); UserGamesOrderResponse.addUpdatedAt(builder, BigInt(updatedAt)); UserGamesOrderResponse.addCommands(builder, commandsVec); const offset = UserGamesOrderResponse.endUserGamesOrderResponse(builder); builder.finish(offset); return builder.asUint8Array(); } export function buildOrderGetResponsePayload( gameId: string, commands: CommandResultFixture[], updatedAt: number, found = true, ): Uint8Array { const builder = new Builder(256); let orderOffset = 0; if (found) { const itemOffsets = commands.map((c) => encodeItem(builder, c)); const commandsVec = UserGamesOrder.createCommandsVector( builder, itemOffsets, ); const [hi, lo] = uuidToHiLo(gameId); const gameIdOffset = UUID.createUUID(builder, hi, lo); UserGamesOrder.startUserGamesOrder(builder); UserGamesOrder.addGameId(builder, gameIdOffset); UserGamesOrder.addUpdatedAt(builder, BigInt(updatedAt)); UserGamesOrder.addCommands(builder, commandsVec); orderOffset = UserGamesOrder.endUserGamesOrder(builder); } UserGamesOrderGetResponse.startUserGamesOrderGetResponse(builder); UserGamesOrderGetResponse.addFound(builder, found); if (orderOffset !== 0) { UserGamesOrderGetResponse.addOrder(builder, orderOffset); } const offset = UserGamesOrderGetResponse.endUserGamesOrderGetResponse(builder); builder.finish(offset); return builder.asUint8Array(); } function encodeItem(builder: Builder, c: CommandResultFixture): number { const cmdIdOffset = builder.createString(c.cmdId); const nameOffset = builder.createString(c.name); const inner = CommandPlanetRename.createCommandPlanetRename( builder, BigInt(c.planetNumber), nameOffset, ); CommandItem.startCommandItem(builder); CommandItem.addCmdId(builder, cmdIdOffset); if (c.applied !== null) CommandItem.addCmdApplied(builder, c.applied); if (c.errorCode !== null) { CommandItem.addCmdErrorCode(builder, BigInt(c.errorCode)); } CommandItem.addPayloadType(builder, CommandPayload.CommandPlanetRename); CommandItem.addPayload(builder, inner); return CommandItem.endCommandItem(builder); }