tressi
Version:
A lightweight, declarative stress testing CLI for modern developers.
158 lines (153 loc) • 6.58 kB
TypeScript
import { z } from 'zod';
/**
* Zod schema for a single request configuration.
*/
declare const RequestConfigSchema: z.ZodObject<{
/** The URL to send the request to. */
url: z.ZodString;
/** The request payload. Can be a JSON object or an array. */
payload: z.ZodOptional<z.ZodUnion<[z.ZodRecord<z.ZodString, z.ZodUnknown>, z.ZodArray<z.ZodUnknown, "many">]>>;
/** The HTTP method to use for the request. Defaults to GET. */
method: z.ZodDefault<z.ZodEffects<z.ZodEnum<["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"]>, "GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "HEAD" | "OPTIONS", unknown>>;
/** Headers to be sent with this specific request. Merged with global headers. */
headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
}, "strip", z.ZodTypeAny, {
url: string;
method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "HEAD" | "OPTIONS";
headers?: Record<string, string> | undefined;
payload?: unknown[] | Record<string, unknown> | undefined;
}, {
url: string;
headers?: Record<string, string> | undefined;
payload?: unknown[] | Record<string, unknown> | undefined;
method?: unknown;
}>;
/**
* Zod schema for the main Tressi configuration.
*/
declare const TressiConfigSchema: z.ZodObject<{
/** A URL to the JSON schema for this configuration file. */
$schema: z.ZodOptional<z.ZodString>;
/** Global headers to be sent with every request. */
headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
/** An array of request configurations. */
requests: z.ZodArray<z.ZodObject<{
/** The URL to send the request to. */
url: z.ZodString;
/** The request payload. Can be a JSON object or an array. */
payload: z.ZodOptional<z.ZodUnion<[z.ZodRecord<z.ZodString, z.ZodUnknown>, z.ZodArray<z.ZodUnknown, "many">]>>;
/** The HTTP method to use for the request. Defaults to GET. */
method: z.ZodDefault<z.ZodEffects<z.ZodEnum<["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"]>, "GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "HEAD" | "OPTIONS", unknown>>;
/** Headers to be sent with this specific request. Merged with global headers. */
headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
}, "strip", z.ZodTypeAny, {
url: string;
method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "HEAD" | "OPTIONS";
headers?: Record<string, string> | undefined;
payload?: unknown[] | Record<string, unknown> | undefined;
}, {
url: string;
headers?: Record<string, string> | undefined;
payload?: unknown[] | Record<string, unknown> | undefined;
method?: unknown;
}>, "many">;
}, "strip", z.ZodTypeAny, {
requests: {
url: string;
method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "HEAD" | "OPTIONS";
headers?: Record<string, string> | undefined;
payload?: unknown[] | Record<string, unknown> | undefined;
}[];
$schema?: string | undefined;
headers?: Record<string, string> | undefined;
}, {
requests: {
url: string;
headers?: Record<string, string> | undefined;
payload?: unknown[] | Record<string, unknown> | undefined;
method?: unknown;
}[];
$schema?: string | undefined;
headers?: Record<string, string> | undefined;
}>;
/**
* Type representing the Tressi configuration.
*/
type TressiConfig = z.infer<typeof TressiConfigSchema>;
/**
* Type representing a single request configuration.
*/
type RequestConfig = z.infer<typeof RequestConfigSchema>;
interface EndpointSummary {
method: string;
url: string;
totalRequests: number;
successfulRequests: number;
failedRequests: number;
avgLatencyMs: number;
minLatencyMs: number;
maxLatencyMs: number;
p95LatencyMs: number;
p99LatencyMs: number;
}
interface GlobalSummary {
totalRequests: number;
successfulRequests: number;
failedRequests: number;
avgLatencyMs: number;
minLatencyMs: number;
maxLatencyMs: number;
p95LatencyMs: number;
p99LatencyMs: number;
actualRps: number;
theoreticalMaxRps: number;
achievedPercentage: number;
duration: number;
}
interface TestSummary {
tressiVersion: string;
global: GlobalSummary;
endpoints: EndpointSummary[];
}
/**
* Defines the options for a Tressi load test run.
*/
interface RunOptions {
/** The configuration for the test. Can be a path to a file, a URL, or a configuration object. */
config: string | TressiConfig;
/** The number of concurrent workers to use. Defaults to 10. For autoscale, this is the max workers. */
workers?: number;
/** The total duration of the test in seconds. Defaults to 10. */
durationSec?: number;
/** The time in seconds to ramp up to the target RPS. Defaults to 0. */
rampUpTimeSec?: number;
/** The target requests per second. If not provided, the test will run at maximum possible speed. */
rps?: number;
/** Whether to enable autoscale mode. Defaults to false. --rps is required for this. */
autoscale?: boolean;
/** The base path for the exported report. If not provided, no report will be generated. */
exportPath?: string | boolean;
/** Whether to use the terminal UI. Defaults to true. */
useUI?: boolean;
/** Suppress all console output. Defaults to false. */
silent?: boolean;
/** Whether to enable early exit on error conditions. Defaults to false. */
earlyExitOnError?: boolean;
/** Error rate threshold (0.0-1.0) to trigger early exit. Requires earlyExitOnError=true. */
errorRateThreshold?: number;
/** Absolute error count threshold to trigger early exit. Requires earlyExitOnError=true. */
errorCountThreshold?: number;
/** Specific HTTP status codes that should trigger early exit. Requires earlyExitOnError=true. */
errorStatusCodes?: number[];
/** Number of concurrent requests per worker. Defaults to dynamic calculation based on target RPS. */
concurrentRequestsPerWorker?: number;
}
/**
* The main function to execute a Tressi load test.
* It loads the configuration, initializes the runner, starts the UI,
* and prints a summary upon completion.
* @param options The `RunOptions` for the test.
* @returns A `Promise` that resolves with the `TestSummary` object.
*/
declare function runLoadTest(options: RunOptions): Promise<TestSummary>;
export { type RequestConfig, type RunOptions, type TestSummary, type TressiConfig, runLoadTest };