Preserve authorized cold-load browser refusals and private aggregate metadata usage (#641)
This commit is contained in:
parent
94ddc8bedf
commit
7545f7392d
@@ -1,12 +1,8 @@
|
|||||||
import { constants } from "node:fs";
|
import { constants } from "node:fs";
|
||||||
import { open } from "node:fs/promises";
|
import { open } from "node:fs/promises";
|
||||||
|
|
||||||
const admissionFailure = (
|
const admissionFailure = (code: string, kind: "file-bytes", measured: number, limit: number) =>
|
||||||
code: string,
|
Object.assign(Error(code), { metadataAdmission: { kind, measured, limit } });
|
||||||
kind: "file-bytes" | "total-bytes" | "owner-bytes" | "candidates",
|
|
||||||
measured: number,
|
|
||||||
limit: number,
|
|
||||||
) => Object.assign(Error(code), { metadataAdmission: { kind, measured, limit } });
|
|
||||||
|
|
||||||
/** Admission estimates, not a hard V8 heap limit. A process/cgroup ceiling is
|
/** Admission estimates, not a hard V8 heap limit. A process/cgroup ceiling is
|
||||||
* still required. Charge input, parse trees and derived indexes before reading
|
* still required. Charge input, parse trees and derived indexes before reading
|
||||||
@@ -34,8 +30,7 @@ export class CandidateMetadataBudget {
|
|||||||
}
|
}
|
||||||
acquire(owner: string) {
|
acquire(owner: string) {
|
||||||
if (!owner || owner.length > 4096) throw Error("INVALID_CANDIDATE_METADATA_OWNER");
|
if (!owner || owner.length > 4096) throw Error("INVALID_CANDIDATE_METADATA_OWNER");
|
||||||
if (this.scopes >= this.limits.candidates)
|
if (this.scopes >= this.limits.candidates) throw Error("CANDIDATE_METADATA_LIMIT");
|
||||||
throw admissionFailure("CANDIDATE_METADATA_LIMIT", "candidates", this.scopes + 1, this.limits.candidates);
|
|
||||||
this.scopes++;
|
this.scopes++;
|
||||||
let bytes = 0,
|
let bytes = 0,
|
||||||
closed = false;
|
closed = false;
|
||||||
@@ -43,10 +38,8 @@ export class CandidateMetadataBudget {
|
|||||||
if (closed) throw Error("CANDIDATE_METADATA_CLOSED");
|
if (closed) throw Error("CANDIDATE_METADATA_CLOSED");
|
||||||
if (!Number.isSafeInteger(amount) || amount < 0) throw Error("INVALID_CANDIDATE_METADATA_CHARGE");
|
if (!Number.isSafeInteger(amount) || amount < 0) throw Error("INVALID_CANDIDATE_METADATA_CHARGE");
|
||||||
const owned = this.owners.get(owner) ?? 0;
|
const owned = this.owners.get(owner) ?? 0;
|
||||||
if (this.bytes + amount > this.limits.bytes)
|
if (this.bytes + amount > this.limits.bytes || owned + amount > this.limits.ownerBytes)
|
||||||
throw admissionFailure("CANDIDATE_METADATA_LIMIT", "total-bytes", this.bytes + amount, this.limits.bytes);
|
throw Error("CANDIDATE_METADATA_LIMIT");
|
||||||
if (owned + amount > this.limits.ownerBytes)
|
|
||||||
throw admissionFailure("CANDIDATE_METADATA_LIMIT", "owner-bytes", owned + amount, this.limits.ownerBytes);
|
|
||||||
bytes += amount;
|
bytes += amount;
|
||||||
this.bytes += amount;
|
this.bytes += amount;
|
||||||
this.owners.set(owner, owned + amount);
|
this.owners.set(owner, owned + amount);
|
||||||
|
|||||||
Reference in New Issue
Block a user