earendil-works/pi · error · FrameError

Frame must contain exactly one complete payload

Error message

Frame must contain exactly one complete payload

What it means

Error "Frame must contain exactly one complete payload" thrown in earendil-works/pi.

Source

Thrown at packages/protocol/src/framing.ts:51

	frame[0] = length >>> 24;
	frame[1] = length >>> 16;
	frame[2] = length >>> 8;
	frame[3] = length;
	frame.set(payload, FRAME_HEADER_LENGTH);
	return frame;
}

/** Validates that bytes contain exactly one complete frame within the configured limit. */
export function assertCompleteFrame(frame: Uint8Array, options?: FrameDecoderOptions): void {
	if (!(frame instanceof Uint8Array)) throw new TypeError("Frame must be a Uint8Array");
	if (frame.byteLength < FRAME_HEADER_LENGTH) throw new FrameError("Frame does not contain a complete length prefix");
	const length = frame[0]! * 0x1_000_000 + frame[1]! * 0x1_0000 + frame[2]! * 0x100 + frame[3]!;
	const maxFrameLength = resolveMaxFrameLength(options);
	if (length > maxFrameLength) {
		throw new FrameError(`Frame length ${length} exceeds configured limit of ${maxFrameLength}`);
	}
	if (frame.byteLength !== FRAME_HEADER_LENGTH + length) {
		throw new FrameError("Frame must contain exactly one complete payload");
	}
}

type DecoderState = "open" | "ended" | "failed";

/** Incrementally splits arbitrary byte chunks into length-prefixed payloads. */
export class FrameDecoder {
	private readonly header = new Uint8Array(FRAME_HEADER_LENGTH);
	private headerLength = 0;
	private readonly maxFrameLength: number;
	private payloadBlocks: Uint8Array[] = [];
	private currentPayloadBlock: Uint8Array | undefined;
	private currentPayloadBlockLength = 0;
	private expectedPayloadLength: number | undefined;
	private payloadLength = 0;
	private state: DecoderState = "open";

	constructor(options?: FrameDecoderOptions) {

View on GitHub (pinned to 4af9d21d3b)

Solutions

  1. Supply exactly one complete length-prefixed payload; the frame has trailing or missing bytes.

When it happens

Trigger: Thrown at packages/protocol/src/framing.ts:51 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of earendil-works/pi@4af9d21d3b (2026-08-24). Data as JSON: /api/errors/e851c1de3892a4e9. Report an issue: GitHub.