UNPKG

@axiomhq/js

Version:

The official javascript bindings for the Axiom API

96 lines (80 loc) 3.01 kB
export const headerRateScope = "X-RateLimit-Scope"; export const headerAPILimit = "X-RateLimit-Limit"; export const headerAPIRateRemaining = "X-RateLimit-Remaining"; export const headerAPIRateReset = "X-RateLimit-Reset"; export const headerQueryLimit = "X-QueryLimit-Limit"; export const headerQueryRemaining = "X-QueryLimit-Remaining"; export const headerQueryReset = "X-QueryLimit-Reset"; export const headerIngestLimit = "X-IngestLimit-Limit"; export const headerIngestRemaining = "X-IngestLimit-Remaining"; export const headerIngestReset = "X-IngestLimit-Reset"; export enum LimitScope { unknown = "unknown", user = "user", organization = "organization", anonymous = "anonymous", } export enum LimitType { api = "api", query = "query", ingest = "ingest", } export class Limit { constructor( public scope: LimitScope = LimitScope.unknown, public type: LimitType = LimitType.api, public value: number = 0, public remaining: number = -1, public reset: Date = new Date(), ) {} } // parse limit headers from axios response and return a limit object export function parseLimitFromResponse(response: Response): Limit { let limit: Limit; if (response.url?.endsWith("/ingest")) { limit = parseLimitFromHeaders(response, "", headerIngestLimit, headerIngestRemaining, headerIngestReset); limit.type = LimitType.ingest; } else if (response.url?.endsWith("/query") || response.url?.endsWith("/_apl")) { limit = parseLimitFromHeaders(response, "", headerQueryLimit, headerQueryRemaining, headerQueryReset); limit.type = LimitType.query; } else { limit = parseLimitFromHeaders( response, headerRateScope, headerAPILimit, headerAPIRateRemaining, headerAPIRateReset, ); limit.type = LimitType.api; } return limit; } export const limitKey = (type: LimitType, scope: LimitScope): string => `${type}:${scope}`; // parseLimitFromHeaders parses the named headers from a `*http.Response`. function parseLimitFromHeaders( response: Response, headerScope: string, headerLimit: string, headerRemaining: string, headerReset: string, ): Limit { const limit: Limit = new Limit(); const scope: string = response.headers.get(headerScope.toLowerCase()) || LimitScope.unknown; limit.scope = LimitScope[scope as keyof typeof LimitScope]; const limitValue = response.headers.get(headerLimit.toLowerCase()) || ""; const limitValueNumber = parseInt(limitValue, 10); if (!isNaN(limitValueNumber)) { limit.value = limitValueNumber; } const remainingValue = response.headers.get(headerRemaining.toLowerCase()) || ""; const remainingValueNumber = parseInt(remainingValue, 10); if (!isNaN(remainingValueNumber)) { limit.remaining = remainingValueNumber; } const resetValue = response.headers.get(headerReset.toLowerCase()) || ""; const resetValueInt = parseInt(resetValue, 10); if (!isNaN(resetValueInt)) { limit.reset = new Date(resetValueInt * 1000); } return limit; }