earendil-works/pi · error · FrameError

Frame does not contain a complete length prefix

Error message

Frame does not contain a complete length prefix

What it means

Error "Frame does not contain a complete length prefix" thrown in earendil-works/pi.

Source

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

/** Prefixes a payload with its unsigned 32-bit big-endian byte length. */
export function encodeFrame(payload: Uint8Array): Uint8Array {
	if (!(payload instanceof Uint8Array)) throw new TypeError("Frame payload must be a Uint8Array");
	if (payload.byteLength > MAX_UINT32) throw new RangeError("Frame payload exceeds the unsigned 32-bit length limit");
	const frame = new Uint8Array(FRAME_HEADER_LENGTH + payload.byteLength);
	const length = payload.byteLength;
	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[] = [];

View on GitHub (pinned to 4af9d21d3b)

Solutions

  1. The buffer lacks a complete length prefix; read more bytes before decoding.

When it happens

Trigger: Thrown at packages/protocol/src/framing.ts:44 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/1e87bf6d2aa35147. Report an issue: GitHub.