mirror of
https://github.com/openclaw/openclaw.git
synced 2026-08-12 21:53:00 -06:00
b4a26783f7
* refactor(test): consolidate duplicated test helpers * test: remove stale record guard import * fix(test): remove orphaned record guards * refactor(test): keep record requirement messages exhaustively typed * fix(test): keep packages/ai record guard package-local
118 lines
3.2 KiB
TypeScript
118 lines
3.2 KiB
TypeScript
type MockCallSource = {
|
|
mock: { calls: readonly (readonly unknown[])[] };
|
|
};
|
|
|
|
type TrackedOversizedJsonResponse = {
|
|
response: Response;
|
|
getReadCount: () => number;
|
|
wasCanceled: () => boolean;
|
|
};
|
|
|
|
type FixedOversizedJsonResponse = {
|
|
response: Response;
|
|
state: { canceled: boolean; enqueuedBytes: number };
|
|
};
|
|
|
|
export function oversizedJsonResponse(): FixedOversizedJsonResponse;
|
|
export function oversizedJsonResponse(params: {
|
|
chunkCount: number;
|
|
chunkSize: number;
|
|
}): TrackedOversizedJsonResponse;
|
|
export function oversizedJsonResponse(params?: {
|
|
chunkCount: number;
|
|
chunkSize: number;
|
|
}): FixedOversizedJsonResponse | TrackedOversizedJsonResponse {
|
|
if (params) {
|
|
const chunk = new Uint8Array(params.chunkSize);
|
|
let readCount = 0;
|
|
let canceled = false;
|
|
return {
|
|
response: new Response(
|
|
new ReadableStream<Uint8Array>({
|
|
pull(controller) {
|
|
if (readCount >= params.chunkCount) {
|
|
controller.close();
|
|
return;
|
|
}
|
|
readCount += 1;
|
|
controller.enqueue(chunk);
|
|
},
|
|
cancel() {
|
|
canceled = true;
|
|
},
|
|
}),
|
|
{
|
|
status: 200,
|
|
headers: { "Content-Type": "application/json" },
|
|
},
|
|
),
|
|
getReadCount: () => readCount,
|
|
wasCanceled: () => canceled,
|
|
};
|
|
}
|
|
|
|
// Cap the advertised stream at 64 MiB so a broken bounded reader fails
|
|
// instead of hanging, while still forcing cancellation past the 16 MiB limit.
|
|
const state = { canceled: false, enqueuedBytes: 0 };
|
|
const chunk = 1024 * 1024;
|
|
const maxChunks = 64;
|
|
let emitted = 0;
|
|
const response = new Response(
|
|
new ReadableStream({
|
|
pull(controller) {
|
|
if (emitted >= maxChunks) {
|
|
controller.close();
|
|
return;
|
|
}
|
|
emitted += 1;
|
|
state.enqueuedBytes += chunk;
|
|
controller.enqueue(new Uint8Array(chunk));
|
|
},
|
|
cancel() {
|
|
state.canceled = true;
|
|
},
|
|
}),
|
|
{ headers: { "content-type": "application/json" } },
|
|
);
|
|
return { response, state };
|
|
}
|
|
|
|
export function bufferedOversizedJsonResponse(): Response {
|
|
return new Response(Buffer.alloc(16 * 1024 * 1024 + 1, 0x20), {
|
|
status: 200,
|
|
headers: { "Content-Type": "application/json" },
|
|
});
|
|
}
|
|
|
|
export function streamedJsonResponse(payload: unknown): Response {
|
|
// Keep a real body stream so bounded-reader tests exercise reads and cancellation.
|
|
return new Response(
|
|
new ReadableStream({
|
|
start(controller) {
|
|
controller.enqueue(new TextEncoder().encode(JSON.stringify(payload)));
|
|
controller.close();
|
|
},
|
|
}),
|
|
{ status: 200, headers: { "content-type": "application/json" } },
|
|
);
|
|
}
|
|
|
|
export function requireFirstPostJsonRequest(mock: MockCallSource, label: string): unknown {
|
|
const [call] = mock.mock.calls;
|
|
if (!call) {
|
|
throw new Error(`expected ${label}`);
|
|
}
|
|
return call[0];
|
|
}
|
|
|
|
export function requireFirstPostJsonRecordRequest(
|
|
mock: MockCallSource,
|
|
label: string,
|
|
): Record<string, unknown> {
|
|
const value = requireFirstPostJsonRequest(mock, label);
|
|
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
throw new Error(`expected ${label} to be a record`);
|
|
}
|
|
return value as Record<string, unknown>;
|
|
}
|