forked from Lilly-Protocol/lily-sdk
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhttp.cjs.map
More file actions
1 lines (1 loc) · 21.7 KB
/
Copy pathhttp.cjs.map
File metadata and controls
1 lines (1 loc) · 21.7 KB
1
{"version":3,"sources":["../src/http/resolve-auth-headers.ts","../src/errors/sdk-error.ts","../src/http/fetch-http-client.ts"],"names":[],"mappings":"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","file":"http.cjs","sourcesContent":["import type { ResolvedLilySdkConfig } from '../config/types';\n\nexport function toBearer(token: string): string {\n return /^Bearer\\s+/i.test(token) ? token : `Bearer ${token}`;\n}\n\nexport function resolveAuthHeaders(\n config: ResolvedLilySdkConfig,\n): Record<string, string> {\n const headers: Record<string, string> = {};\n\n if (config.apiKey !== undefined) {\n headers['x-api-key'] = config.apiKey;\n }\n\n if (config.authToken !== undefined) {\n headers.authorization = toBearer(config.authToken);\n }\n\n return headers;\n}\n","export interface LilyRequestMetadata {\n method: string;\n path: string;\n url: string;\n}\n\nexport interface LilyErrorOptions {\n code?: string;\n statusCode?: number;\n details?: unknown;\n cause?: unknown;\n request?: LilyRequestMetadata;\n /** Redacted excerpt of the response body, safe to log or send to a bug tracker. */\n bodySnippet?: string;\n /** Delta-seconds value from a Retry-After header, when present. */\n retryAfterSeconds?: number;\n}\n\nexport const LILY_ERROR_CODES = Object.freeze({\n CONFIG_ERROR: 'CONFIG_ERROR',\n API_ERROR: 'API_ERROR',\n AUTHENTICATION_ERROR: 'AUTHENTICATION_ERROR',\n AUTHORIZATION_ERROR: 'AUTHORIZATION_ERROR',\n VALIDATION_ERROR: 'VALIDATION_ERROR',\n TRANSPORT_ERROR: 'TRANSPORT_ERROR',\n NOT_FOUND: 'NOT_FOUND',\n CONFLICT: 'CONFLICT',\n RATE_LIMITED: 'RATE_LIMITED',\n SERVER_ERROR: 'SERVER_ERROR',\n TIMEOUT: 'TIMEOUT',\n});\n\nexport type LilyErrorCode = keyof typeof LILY_ERROR_CODES;\n\nexport class LilySdkError extends Error {\n public readonly code: string | undefined;\n public readonly statusCode: number | undefined;\n public readonly details: unknown;\n public readonly request: LilyRequestMetadata | undefined;\n\n public constructor(message: string, options: LilyErrorOptions = {}) {\n super(message, { cause: options.cause });\n this.name = new.target.name;\n this.code = options.code;\n this.statusCode = options.statusCode;\n this.details = options.details;\n this.request = options.request;\n }\n\n public toJSON(): Record<string, unknown> {\n const result: Record<string, unknown> = {\n name: this.name,\n message: this.message,\n };\n\n if (this.code !== undefined) {\n result.code = this.code;\n }\n\n if (this.statusCode !== undefined) {\n result.statusCode = this.statusCode;\n }\n\n if (this.details !== undefined) {\n result.details = this.details;\n }\n\n if (this.request !== undefined) {\n result.request = this.request;\n }\n\n const cause = this.cause;\n if (cause !== undefined && cause !== null) {\n result.cause =\n cause instanceof LilySdkError\n ? cause.toJSON()\n : cause instanceof Error\n ? { name: cause.name, message: cause.message }\n : cause;\n }\n\n return result;\n }\n\n public override toString(): string {\n const parts: string[] = [this.name, this.message];\n\n if (this.code !== undefined) {\n parts.push(`[${this.code}]`);\n }\n\n if (this.statusCode !== undefined) {\n parts.push(`(HTTP ${this.statusCode})`);\n }\n\n return parts.join(': ');\n }\n}\n\nexport class LilyConfigError extends LilySdkError {}\nexport class LilyTransportError extends LilySdkError {}\nexport class LilyAuthenticationError extends LilySdkError {}\n\n/**\n * Any non-ok HTTP response. The subclasses below narrow it, so\n * `catch (e) { if (e instanceof LilyApiError) ... }` keeps working for callers\n * that only care that the API rejected the request.\n */\nexport class LilyApiError extends LilySdkError {}\nexport class LilyValidationError extends LilySdkError {}\n\nexport class LilyAuthorizationError extends LilyAuthenticationError {}\nexport class LilyNotFoundError extends LilyApiError {}\nexport class LilyConflictError extends LilyApiError {}\nexport class LilyServerError extends LilyApiError {}\n\nexport class LilyRateLimitError extends LilyApiError {\n public readonly retryAfterSeconds: number | undefined;\n\n public constructor(message: string, options: LilyErrorOptions = {}) {\n super(message, options);\n this.retryAfterSeconds = options.retryAfterSeconds;\n }\n}\n\nexport function isLilySdkError(value: unknown): value is LilySdkError {\n return value instanceof LilySdkError;\n}\n","import type { ResolvedLilySdkConfig } from '../config/types';\nimport { resolveAuthHeaders } from './resolve-auth-headers';\nimport {\n LILY_ERROR_CODES,\n LilyApiError,\n LilyAuthenticationError,\n LilySdkError,\n LilyTransportError,\n LilyValidationError,\n} from '../errors/sdk-error';\nimport type {\n HttpClient,\n HttpHeaders,\n HttpRequest,\n HttpResponse,\n} from './types';\n\nconst DEFAULT_RETRYABLE_STATUS_CODES = [408, 409, 425, 429, 500, 502, 503, 504];\n\nexport function createFetchHttpClient(\n config: ResolvedLilySdkConfig,\n): HttpClient {\n return {\n async request<TResponse, TRequest = unknown>(\n request: HttpRequest<TRequest>,\n ): Promise<HttpResponse<TResponse>> {\n const url = buildUrl(config.baseUrl, request.path, request.query);\n const body = serializeBody(request.body);\n const headers = buildHeaders(config, request.headers);\n const timeoutMs = request.timeoutMs ?? config.timeoutMs;\n\n let attempt = 0;\n\n for (;;) {\n const controller = new AbortController();\n let externallyAborted = false;\n let onExternalAbort: (() => void) | undefined;\n\n if (request.signal) {\n if (request.signal.aborted) {\n throw new LilyTransportError('Request cancelled by caller.', {\n code: 'CANCELLED',\n cause: request.signal.reason ?? new Error('Aborted'),\n request: requestMetadata(request, url),\n });\n }\n\n onExternalAbort = () => {\n externallyAborted = true;\n controller.abort(request.signal?.reason);\n };\n request.signal.addEventListener('abort', onExternalAbort, {\n once: true,\n });\n }\n\n let timeout: ReturnType<typeof setTimeout> | undefined;\n if (timeoutMs > 0) {\n timeout = setTimeout(() => controller.abort(), timeoutMs);\n }\n\n const cleanup = (): void => {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n if (request.signal && onExternalAbort) {\n request.signal.removeEventListener('abort', onExternalAbort);\n }\n };\n\n const requestInit: RequestInit = {\n method: request.method,\n headers,\n signal: controller.signal,\n };\n\n if (body !== undefined) {\n requestInit.body = body;\n }\n\n try {\n const response = await config.fetch(url, requestInit);\n\n const data = (await parseResponse(response)) as TResponse;\n\n if (response.ok) {\n cleanup();\n return {\n status: response.status,\n headers: response.headers,\n data,\n attempts: attempt + 1,\n retried: attempt > 0,\n };\n }\n\n // Auth failures are terminal: retrying with the same credential just\n // burns the budget. Checked before shouldRetry for that reason.\n if (response.status === 401 || response.status === 403) {\n cleanup();\n throw new LilyAuthenticationError(\n 'Authentication failed for Lily Protocol API.',\n {\n code: LILY_ERROR_CODES.AUTHENTICATION_ERROR,\n statusCode: response.status,\n details: data,\n request: requestMetadata(request, url),\n },\n );\n }\n\n if (\n shouldRetry(\n response.status,\n attempt,\n config.retry.retries,\n config.retry.retryableStatusCodes,\n request.method,\n )\n ) {\n cleanup();\n attempt += 1;\n await sleep(config.retry.retryDelayMs * attempt);\n continue;\n }\n\n cleanup();\n throw new LilyApiError('Lily Protocol API request failed.', {\n code: LILY_ERROR_CODES.API_ERROR,\n statusCode: response.status,\n details: data,\n request: requestMetadata(request, url),\n });\n } catch (error) {\n cleanup();\n\n // LilySdkError instances (validation, auth, API) are definitive:\n // they must never be retried or re-wrapped.\n if (error instanceof LilySdkError) {\n throw error;\n }\n\n if (error instanceof Error && error.name === 'AbortError') {\n // External cancellation is never retried: the caller asked us to stop.\n if (\n !externallyAborted &&\n attempt < config.retry.retries &&\n isRetryableMethod(request.method)\n ) {\n attempt += 1;\n await sleep(config.retry.retryDelayMs * attempt);\n continue;\n }\n\n throw new LilyTransportError(\n externallyAborted\n ? 'Request cancelled by caller while calling Lily Protocol API.'\n : 'Request timed out while calling Lily Protocol API.',\n {\n code: externallyAborted\n ? 'CANCELLED'\n : LILY_ERROR_CODES.TIMEOUT,\n cause: error,\n request: requestMetadata(request, url),\n },\n );\n }\n\n if (\n attempt < config.retry.retries &&\n isRetryableTransportError(error, request.method)\n ) {\n attempt += 1;\n await sleep(config.retry.retryDelayMs * attempt);\n continue;\n }\n\n throw new LilyTransportError(\n 'Network error while calling Lily Protocol API.',\n {\n code: LILY_ERROR_CODES.TRANSPORT_ERROR,\n cause: error,\n request: requestMetadata(request, url),\n },\n );\n }\n }\n },\n };\n}\n\nfunction requestMetadata(\n request: HttpRequest,\n url: URL,\n): { method: string; path: string; url: string } {\n return {\n method: request.method,\n path: request.path,\n url: url.toString(),\n };\n}\n\nexport function buildUrl(\n baseUrl: URL,\n path: string,\n query?: Record<\n string,\n string | number | boolean | (string | number)[] | undefined\n >,\n): URL {\n const cleanPath = path.startsWith('/') ? path.slice(1) : path;\n const url = new URL(cleanPath, baseUrl);\n\n for (const [key, value] of Object.entries(query ?? {})) {\n if (value === undefined) {\n continue;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n url.searchParams.append(key, String(item));\n }\n } else {\n url.searchParams.set(key, String(value));\n }\n }\n\n return url;\n}\n\nfunction buildHeaders(\n config: ResolvedLilySdkConfig,\n requestHeaders?: HttpHeaders,\n): HttpHeaders {\n const headers: Record<string, string> = {\n accept: 'application/json',\n 'content-type': 'application/json',\n 'user-agent': config.userAgent,\n ...config.defaultHeaders,\n ...requestHeaders,\n ...resolveAuthHeaders(config),\n };\n\n return headers;\n}\n\nfunction serializeBody(body: unknown): BodyInit | undefined {\n if (body === undefined || body === null) {\n return undefined;\n }\n\n return JSON.stringify(body);\n}\n\nasync function parseResponse(response: Response): Promise<unknown> {\n if (response.status === 204) {\n return null;\n }\n\n const contentType = response.headers.get('content-type') ?? '';\n\n if (contentType.includes('application/json')) {\n try {\n return (await response.json()) as unknown;\n } catch (error) {\n throw new LilyValidationError(\n `Failed to parse response body as JSON (status ${response.status}, content-type: ${contentType}).`,\n {\n code: 'RESPONSE_VALIDATION_ERROR',\n statusCode: response.status,\n cause: error,\n },\n );\n }\n }\n\n return await response.text();\n}\n\nfunction shouldRetry(\n statusCode: number,\n attempt: number,\n maxRetries: number,\n retryableStatusCodes: readonly number[] | undefined,\n method: string,\n): boolean {\n const codes = retryableStatusCodes ?? DEFAULT_RETRYABLE_STATUS_CODES;\n return (\n isRetryableMethod(method) &&\n attempt < maxRetries &&\n codes.includes(statusCode)\n );\n}\n\nfunction isRetryableTransportError(error: unknown, method: string): boolean {\n return isRetryableMethod(method) && error instanceof Error;\n}\n\nfunction isRetryableMethod(method: string): boolean {\n return method === 'GET' || method === 'PUT' || method === 'DELETE';\n}\n\nasync function sleep(ms: number): Promise<void> {\n await new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n"]}