import { APISpec } from "../api-discovery/getApiInfo"; import { Kind } from "../Attack"; import { Source } from "../Source"; export type AgentInfo = { dryMode: boolean; hostname: string; version: string; library: string; packages: Record; ipAddress: string; preventedPrototypePollution: boolean; incompatiblePackages: { prototypePollution: Record; }; os: { name: string; version: string; }; platform: { version: string; arch: string; }; nodeEnv: string; serverless: boolean; stack: string[]; }; type Started = { type: "started"; agent: AgentInfo; time: number; }; export type User = { id: string; name?: string; }; export type DetectedAttack = { type: "detected_attack"; request: { method: string | undefined; ipAddress: string | undefined; userAgent: string | undefined; url: string | undefined; source: string; route: string | undefined; } | undefined; attack: { kind: Kind; operation: string; module: string; blocked: boolean; source: Source | undefined; path: string; stack: string; payload: string | undefined; metadata: Record; user: User | undefined; }; agent: AgentInfo; time: number; }; export type OperationKind = "sql_op" | "nosql_op" | "outgoing_http_op" | "fs_op" | "exec_op" | "deserialize_op" | "graphql_op" | "eval_op" | "ai_op"; type OperationStats = { kind: OperationKind; attacksDetected: { total: number; blocked: number; }; interceptorThrewError: number; withoutContext: number; total: number; compressedTimings: { averageInMS: number; percentiles: Record; compressedAt: number; }[]; }; type Heartbeat = { type: "heartbeat"; stats: { operations: Record; startedAt: number; endedAt: number; requests: { total: number; aborted: number; rateLimited: number; attacksDetected: { total: number; blocked: number; }; attackWaves: { total: number; blocked: number; }; }; userAgents: { breakdown: Record; }; ipAddresses: { breakdown: Record; }; }; ai: { provider: string; model: string; calls: number; tokens: { input: number; output: number; total: number; }; }[]; packages: { name: string; version: string; requiredAt: number; }[]; hostnames: { hostname: string; port: number | undefined; hits: number; }[]; routes: { path: string; method: string; hits: number; rateLimitedCount: number; graphql?: { type: "query" | "mutation"; name: string; }; apispec: APISpec; }[]; users: { id: string; name: string | undefined; lastIpAddress: string | undefined; firstSeenAt: number; lastSeenAt: number; }[]; agent: AgentInfo; time: number; middlewareInstalled?: boolean; }; export type DetectedAttackWave = { type: "detected_attack_wave"; request: { ipAddress: string; userAgent: string | undefined; source: string; }; attack: { metadata: Record; user: User | undefined; }; agent: AgentInfo; time: number; }; export type Event = Started | DetectedAttack | Heartbeat | DetectedAttackWave; export {};