Files
rea/src/domain/jsonStringByteLength.ts
T

31 lines
965 B
TypeScript
Raw Normal View History

/** UTF-8 JSON string bytes without serialization; above budget only establishes overflow. */
export const jsonStringByteLength = (
value: string,
budget = Number.POSITIVE_INFINITY,
): number => {
let bytes = 2;
for (let index = 0; index < value.length && bytes <= budget; index++) {
const unit = value.charCodeAt(index);
if (unit === 0x22 || unit === 0x5c) bytes += 2;
else if (unit < 0x20)
bytes +=
unit === 0x08 ||
unit === 0x09 ||
unit === 0x0a ||
unit === 0x0c ||
unit === 0x0d
? 2
: 6;
else if (unit < 0x80) bytes += 1;
else if (unit < 0x800) bytes += 2;
else if (unit >= 0xd800 && unit <= 0xdbff) {
const next = value.charCodeAt(index + 1);
if (next >= 0xdc00 && next <= 0xdfff) {
bytes += 4;
index++;
} else bytes += 6;
} else if (unit >= 0xdc00 && unit <= 0xdfff) bytes += 6;
else bytes += 3;
}
return bytes;
};