dripfeed 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +355 -0
- package/dist/cli.cjs +270 -0
- package/dist/cli.d.cts +1 -0
- package/dist/cli.d.mts +1 -0
- package/dist/cli.mjs +273 -0
- package/dist/cli.mjs.map +1 -0
- package/dist/index.cjs +21 -0
- package/dist/index.d.cts +187 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +187 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +2 -0
- package/dist/runner-ByEGj869.mjs +647 -0
- package/dist/runner-ByEGj869.mjs.map +1 -0
- package/dist/runner-Dc1JRBps.cjs +758 -0
- package/package.json +98 -0
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
//#region src/core/types.d.ts
|
|
4
|
+
interface RequestResult {
|
|
5
|
+
timestamp: string;
|
|
6
|
+
endpoint: string;
|
|
7
|
+
method: string;
|
|
8
|
+
url: string;
|
|
9
|
+
status: number | null;
|
|
10
|
+
duration_ms: number;
|
|
11
|
+
response_body: string | null;
|
|
12
|
+
error: string | null;
|
|
13
|
+
}
|
|
14
|
+
interface EndpointConfig {
|
|
15
|
+
name: string;
|
|
16
|
+
url: string;
|
|
17
|
+
method?: string;
|
|
18
|
+
headers?: Record<string, string>;
|
|
19
|
+
body?: unknown;
|
|
20
|
+
timeout?: string;
|
|
21
|
+
weight?: number;
|
|
22
|
+
}
|
|
23
|
+
interface ThresholdConfig {
|
|
24
|
+
error_rate?: string;
|
|
25
|
+
p50?: string;
|
|
26
|
+
p95?: string;
|
|
27
|
+
p99?: string;
|
|
28
|
+
max?: string;
|
|
29
|
+
}
|
|
30
|
+
interface DripfeedConfig {
|
|
31
|
+
interval?: string;
|
|
32
|
+
duration?: string;
|
|
33
|
+
timeout?: string;
|
|
34
|
+
storage?: 'sqlite' | 'json' | 'memory';
|
|
35
|
+
db?: string;
|
|
36
|
+
rotation?: 'weighted-random' | 'round-robin' | 'sequential';
|
|
37
|
+
headers?: Record<string, string>;
|
|
38
|
+
endpoints: EndpointConfig[];
|
|
39
|
+
thresholds?: ThresholdConfig;
|
|
40
|
+
}
|
|
41
|
+
/** Check if an HTTP status code represents a successful response */
|
|
42
|
+
declare const isSuccess: (status: number | null) => boolean;
|
|
43
|
+
interface EndpointStats {
|
|
44
|
+
name: string;
|
|
45
|
+
requests: number;
|
|
46
|
+
avg_ms: number;
|
|
47
|
+
p95_ms: number;
|
|
48
|
+
error_count: number;
|
|
49
|
+
}
|
|
50
|
+
interface ErrorGroup {
|
|
51
|
+
endpoint: string;
|
|
52
|
+
status: number | null;
|
|
53
|
+
count: number;
|
|
54
|
+
sample_body: string | null;
|
|
55
|
+
}
|
|
56
|
+
interface ThresholdResult {
|
|
57
|
+
name: string;
|
|
58
|
+
target: string;
|
|
59
|
+
actual: string;
|
|
60
|
+
passed: boolean;
|
|
61
|
+
}
|
|
62
|
+
interface LatencyStats {
|
|
63
|
+
min: number;
|
|
64
|
+
avg: number;
|
|
65
|
+
p50: number;
|
|
66
|
+
p95: number;
|
|
67
|
+
p99: number;
|
|
68
|
+
max: number;
|
|
69
|
+
}
|
|
70
|
+
interface SoakStats {
|
|
71
|
+
duration_s: number;
|
|
72
|
+
total_requests: number;
|
|
73
|
+
success_count: number;
|
|
74
|
+
failure_count: number;
|
|
75
|
+
uptime_pct: number;
|
|
76
|
+
latency: LatencyStats;
|
|
77
|
+
status_codes: Record<number, number>;
|
|
78
|
+
endpoints: EndpointStats[];
|
|
79
|
+
errors: ErrorGroup[];
|
|
80
|
+
thresholds?: ThresholdResult[];
|
|
81
|
+
}
|
|
82
|
+
interface SoakTestHandle {
|
|
83
|
+
start: () => Promise<void>;
|
|
84
|
+
stop: () => Promise<SoakStats>;
|
|
85
|
+
run: (opts?: {
|
|
86
|
+
duration?: string;
|
|
87
|
+
}) => Promise<SoakStats>;
|
|
88
|
+
}
|
|
89
|
+
//#endregion
|
|
90
|
+
//#region src/adapters/reporters/interface.d.ts
|
|
91
|
+
interface Reporter {
|
|
92
|
+
onRequest(result: RequestResult, counts: {
|
|
93
|
+
ok: number;
|
|
94
|
+
fail: number;
|
|
95
|
+
}): void;
|
|
96
|
+
onComplete(stats: SoakStats): void;
|
|
97
|
+
}
|
|
98
|
+
//#endregion
|
|
99
|
+
//#region src/adapters/reporters/console.d.ts
|
|
100
|
+
declare const createConsoleReporter: () => Reporter;
|
|
101
|
+
//#endregion
|
|
102
|
+
//#region src/adapters/reporters/json.d.ts
|
|
103
|
+
declare const createJsonReporter: (outputPath?: string) => Reporter;
|
|
104
|
+
//#endregion
|
|
105
|
+
//#region src/adapters/reporters/markdown.d.ts
|
|
106
|
+
declare const createMarkdownReporter: (outputPath?: string) => Reporter;
|
|
107
|
+
//#endregion
|
|
108
|
+
//#region src/adapters/storage/interface.d.ts
|
|
109
|
+
interface StorageAdapter {
|
|
110
|
+
init(): Promise<void>;
|
|
111
|
+
record(result: RequestResult): Promise<void>;
|
|
112
|
+
getAll(): Promise<RequestResult[]>;
|
|
113
|
+
close(): Promise<void>;
|
|
114
|
+
}
|
|
115
|
+
//#endregion
|
|
116
|
+
//#region src/adapters/storage/json.d.ts
|
|
117
|
+
declare const createJsonStorage: (filePath: string) => StorageAdapter;
|
|
118
|
+
//#endregion
|
|
119
|
+
//#region src/adapters/storage/memory.d.ts
|
|
120
|
+
declare const createMemoryStorage: () => StorageAdapter;
|
|
121
|
+
//#endregion
|
|
122
|
+
//#region src/adapters/storage/sqlite.d.ts
|
|
123
|
+
declare const createSqliteStorage: (dbPath: string) => StorageAdapter;
|
|
124
|
+
//#endregion
|
|
125
|
+
//#region src/adapters/storage/index.d.ts
|
|
126
|
+
declare const createStorage: (config: DripfeedConfig) => StorageAdapter;
|
|
127
|
+
//#endregion
|
|
128
|
+
//#region src/core/config.d.ts
|
|
129
|
+
declare const configSchema: z.ZodObject<{
|
|
130
|
+
interval: z.ZodDefault<z.ZodString>;
|
|
131
|
+
duration: z.ZodOptional<z.ZodString>;
|
|
132
|
+
timeout: z.ZodDefault<z.ZodString>;
|
|
133
|
+
storage: z.ZodDefault<z.ZodEnum<{
|
|
134
|
+
sqlite: "sqlite";
|
|
135
|
+
json: "json";
|
|
136
|
+
memory: "memory";
|
|
137
|
+
}>>;
|
|
138
|
+
db: z.ZodOptional<z.ZodString>;
|
|
139
|
+
rotation: z.ZodDefault<z.ZodEnum<{
|
|
140
|
+
"weighted-random": "weighted-random";
|
|
141
|
+
"round-robin": "round-robin";
|
|
142
|
+
sequential: "sequential";
|
|
143
|
+
}>>;
|
|
144
|
+
headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
145
|
+
endpoints: z.ZodArray<z.ZodObject<{
|
|
146
|
+
name: z.ZodString;
|
|
147
|
+
url: z.ZodString;
|
|
148
|
+
method: z.ZodDefault<z.ZodString>;
|
|
149
|
+
headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
150
|
+
body: z.ZodOptional<z.ZodUnknown>;
|
|
151
|
+
timeout: z.ZodOptional<z.ZodString>;
|
|
152
|
+
weight: z.ZodDefault<z.ZodNumber>;
|
|
153
|
+
}, z.core.$strip>>;
|
|
154
|
+
thresholds: z.ZodOptional<z.ZodObject<{
|
|
155
|
+
error_rate: z.ZodOptional<z.ZodString>;
|
|
156
|
+
p50: z.ZodOptional<z.ZodString>;
|
|
157
|
+
p95: z.ZodOptional<z.ZodString>;
|
|
158
|
+
p99: z.ZodOptional<z.ZodString>;
|
|
159
|
+
max: z.ZodOptional<z.ZodString>;
|
|
160
|
+
}, z.core.$strip>>;
|
|
161
|
+
}, z.core.$strip>;
|
|
162
|
+
type ParsedConfig = z.infer<typeof configSchema>;
|
|
163
|
+
/** Parse and validate a raw config object into a fully-typed ParsedConfig with defaults applied.
|
|
164
|
+
* Use this when creating a soak test programmatically without a config file. */
|
|
165
|
+
declare const parseConfig: (raw: unknown) => ParsedConfig;
|
|
166
|
+
declare const loadDripfeedConfig: (overrides?: Partial<ParsedConfig>) => Promise<ParsedConfig>;
|
|
167
|
+
//#endregion
|
|
168
|
+
//#region src/core/runner.d.ts
|
|
169
|
+
declare const createSoakTest: (config: ParsedConfig, reporters?: Reporter[]) => SoakTestHandle;
|
|
170
|
+
//#endregion
|
|
171
|
+
//#region src/utils/duration.d.ts
|
|
172
|
+
declare const parseDuration: (input: string) => number;
|
|
173
|
+
//#endregion
|
|
174
|
+
//#region src/utils/http.d.ts
|
|
175
|
+
declare const timedFetch: (endpoint: EndpointConfig, globalHeaders?: Record<string, string>, timeout?: string) => Promise<RequestResult>;
|
|
176
|
+
//#endregion
|
|
177
|
+
//#region src/utils/runtime.d.ts
|
|
178
|
+
declare const isBun: boolean;
|
|
179
|
+
declare const isDeno: boolean;
|
|
180
|
+
declare const isNode: boolean;
|
|
181
|
+
//#endregion
|
|
182
|
+
//#region src/utils/stats.d.ts
|
|
183
|
+
declare const percentile: (sorted: number[], p: number) => number;
|
|
184
|
+
declare const computeStats: (results: RequestResult[], startTime: Date, thresholds?: ThresholdConfig, endTime?: Date) => SoakStats;
|
|
185
|
+
//#endregion
|
|
186
|
+
export { type DripfeedConfig, type EndpointConfig, type EndpointStats, type ErrorGroup, type LatencyStats, type ParsedConfig, type Reporter, type RequestResult, type SoakStats, type SoakTestHandle, type StorageAdapter, type ThresholdConfig, type ThresholdResult, computeStats, configSchema, createConsoleReporter, createJsonReporter, createJsonStorage, createMarkdownReporter, createMemoryStorage, createSoakTest, createSqliteStorage, createStorage, isBun, isDeno, isNode, isSuccess, loadDripfeedConfig, parseConfig, parseDuration, percentile, timedFetch };
|
|
187
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/core/types.ts","../src/adapters/reporters/interface.ts","../src/adapters/reporters/console.ts","../src/adapters/reporters/json.ts","../src/adapters/reporters/markdown.ts","../src/adapters/storage/interface.ts","../src/adapters/storage/json.ts","../src/adapters/storage/memory.ts","../src/adapters/storage/sqlite.ts","../src/adapters/storage/index.ts","../src/core/config.ts","../src/core/runner.ts","../src/utils/duration.ts","../src/utils/http.ts","../src/utils/runtime.ts","../src/utils/stats.ts"],"mappings":"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"}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { _ as createJsonReporter, a as parseDuration, c as parseConfig, d as isBun, f as isDeno, g as createMarkdownReporter, h as createJsonStorage, i as timedFetch, l as createStorage, m as createMemoryStorage, n as computeStats, o as configSchema, p as isNode, r as percentile, s as loadDripfeedConfig, t as createSoakTest, u as createSqliteStorage, v as createConsoleReporter, y as isSuccess } from "./runner-ByEGj869.mjs";
|
|
2
|
+
export { computeStats, configSchema, createConsoleReporter, createJsonReporter, createJsonStorage, createMarkdownReporter, createMemoryStorage, createSoakTest, createSqliteStorage, createStorage, isBun, isDeno, isNode, isSuccess, loadDripfeedConfig, parseConfig, parseDuration, percentile, timedFetch };
|