28 lines
802 B
TypeScript
28 lines
802 B
TypeScript
export type ProviderOutputLimiter = Readonly<{
|
|
consume(chunk: Buffer | string): void;
|
|
bytes(): number;
|
|
}>;
|
|
|
|
export function createProviderOutputLimiter(
|
|
maxBytes: number,
|
|
onExceeded: () => void,
|
|
): ProviderOutputLimiter {
|
|
if (!Number.isSafeInteger(maxBytes) || maxBytes <= 0 || typeof onExceeded !== "function") {
|
|
throw new TypeError("provider output limiter input is invalid");
|
|
}
|
|
let observedBytes = 0;
|
|
let exceeded = false;
|
|
return Object.freeze({
|
|
consume: (chunk: Buffer | string) => {
|
|
if (exceeded) return;
|
|
const bytes = Buffer.isBuffer(chunk) ? chunk.byteLength : Buffer.byteLength(chunk);
|
|
observedBytes += bytes;
|
|
if (observedBytes > maxBytes) {
|
|
exceeded = true;
|
|
onExceeded();
|
|
}
|
|
},
|
|
bytes: () => observedBytes,
|
|
});
|
|
}
|