earendil-works/pi · error · CborError
CBOR map keys must be strings
Error message
CBOR map keys must be strings
What it means
Error "CBOR map keys must be strings" thrown in earendil-works/pi.
Source
Thrown at packages/protocol/src/cbor/encoder.ts:183
ancestors.add(value);
try {
writeArgument(writer, 4, value.length);
for (let index = 0; index < value.length; index++) {
if (!Object.hasOwn(value, index) || value[index] === undefined) {
throw new CborError("CBOR arrays must not contain holes or undefined values");
}
encodeValue(writer, value[index], options, depth + 1, ancestors);
}
} finally {
ancestors.delete(value);
}
return;
}
if (isPlainObject(value)) {
if (ancestors.has(value)) throw new CborError("CBOR values must not contain cycles");
for (const symbol of Object.getOwnPropertySymbols(value)) {
if (Object.prototype.propertyIsEnumerable.call(value, symbol)) {
throw new CborError("CBOR map keys must be strings");
}
}
const entries: Array<readonly [string, unknown]> = [];
for (const key of Object.keys(value)) {
const entryValue = value[key];
if (entryValue !== undefined) entries.push([key, entryValue]);
}
if (entries.length > options.maxContainerLength) {
throw new CborError(`CBOR map length exceeds configured limit of ${options.maxContainerLength}`);
}
ancestors.add(value);
try {
writeArgument(writer, 5, entries.length);
for (const [key, entryValue] of entries) {
encodeText(writer, key, options);
encodeValue(writer, entryValue, options, depth + 1, ancestors);
}
} finally {View on GitHub (pinned to 4af9d21d3b)
Solutions
- Use string keys in objects and Maps; convert other key types to strings first.
When it happens
Trigger: Thrown at packages/protocol/src/cbor/encoder.ts:183 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/b32a4801a4531331.
Report an issue: GitHub.