Files
bun.sh/src/js/internal/buffer.ts
2025-02-14 23:30:18 -08:00

51 lines
1.6 KiB
TypeScript

const { validateNumber } = require("internal/validators");
function boundsError(value, length, type?) {
if (Math.floor(value) !== value) {
validateNumber(value, type);
throw $ERR_OUT_OF_RANGE(type || "offset", "an integer", value);
}
if (length < 0) throw $ERR_BUFFER_OUT_OF_BOUNDS();
throw $ERR_OUT_OF_RANGE(type || "offset", `>= ${type ? 1 : 0} and <= ${length}`, value);
}
function checkBounds(buf, offset, byteLength) {
validateNumber(offset, "offset");
if (buf[offset] === undefined || buf[offset + byteLength - 1] === undefined)
boundsError(offset, buf.length - byteLength);
}
function checkInt(buf, value, offset, min, max, byteLength) {
if (value > max || value < min) {
const n = typeof min === "bigint" ? "n" : "";
let range;
if (byteLength > 4) {
if (min === 0 || min === 0n) {
range = `>= 0${n} and < 2${n} ** ${byteLength * 8}${n}`;
} else {
range = `>= -(2${n} ** ${byteLength * 8 - 1}${n}) and ` + `< 2${n} ** ${byteLength * 8 - 1}${n}`;
}
} else {
range = `>= ${min}${n} and <= ${max}${n}`;
}
throw $ERR_OUT_OF_RANGE("value", range, value);
}
checkBounds(buf, offset, byteLength);
}
function writeU_Int8(buf, value, offset, min, max) {
// `checkInt()` can not be used here because it checks two entries.
validateNumber(offset, "offset");
if (value > max || value < min) {
throw $ERR_OUT_OF_RANGE("value", `>= ${min} and <= ${max}`, value);
}
if (buf[offset] === undefined) boundsError(offset, buf.length - 1);
}
export default {
boundsError,
checkBounds,
checkInt,
writeU_Int8,
};