stellate
Version:
The CLI you need to work with Stellate from your CLI. See https://docs.stellate.co/docs/cli for the complete documentation.
70 lines (67 loc) • 1.93 kB
TypeScript
type TimeWindow = `${number}${'s' | 'm' | 'h'}` | {
value: number;
unit: 'seconds' | 'minutes' | 'hours';
};
interface EdgeRequest {
method: string;
path: string;
queryString: string;
queryParams: Record<string, string | string[]>;
headers: Record<string, string | string[]>;
ip: string;
jwt: Record<string, unknown> | null;
operation: 'query' | 'mutation' | 'subscription';
rootFields: {
name: string;
alias: string | null;
args: Record<string, unknown>;
}[];
}
interface ComplexityLimit {
type: 'QueryComplexity';
budget: number;
warning?: number;
window: TimeWindow;
}
interface RequestLimit {
type: 'RequestCount';
budget: number;
warning?: number;
window: TimeWindow;
}
type RateLimitGroupBy = 'ip' | {
header: string;
} | {
cookie: string;
} | {
jwt: string;
} | {
consumerIdentifier: string;
};
interface BaseRateLimitRule {
name: string;
description?: string;
state?: 'enabled' | 'disabled' | 'dryRun';
allowList?: readonly string[];
limit: ComplexityLimit | RequestLimit;
}
type DynamicRateLimitRule = BaseRateLimitRule & ({
groupBy: RateLimitGroupBy;
} | {
group: string | number;
});
declare function isQuery(req: EdgeRequest): boolean;
declare function isMutation(req: EdgeRequest): boolean;
declare function hasRootField(req: EdgeRequest, rootField: string): boolean;
type FieldConfigMap = {
[rootFieldName: string]: Omit<RequestLimit, 'type'>;
};
type OmitLimitKey<Type> = {
[Key in keyof Type as Exclude<Key, 'limit'>]: Type[Key];
};
type ByFieldConfig = OmitLimitKey<DynamicRateLimitRule> & {
queryFields?: FieldConfigMap;
mutationFields?: FieldConfigMap;
};
declare function byField(req: EdgeRequest, { queryFields, mutationFields, ...baseConfig }: ByFieldConfig): DynamicRateLimitRule[];
export { byField, hasRootField, isMutation, isQuery };