@blimu/client 1.1.0 → 1.1.1
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/dist/client.js +1 -0
- package/dist/client.js.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -0
- package/dist/index.mjs.map +1 -1
- package/dist/schema.js +1 -0
- package/dist/schema.js.map +1 -1
- package/dist/schema.zod.js +1 -0
- package/dist/schema.zod.js.map +1 -1
- package/dist/services/auth.js +1 -0
- package/dist/services/auth.js.map +1 -1
- package/dist/services/entitlements.js +1 -0
- package/dist/services/entitlements.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utils.js +1 -0
- package/dist/utils.js.map +1 -1
- package/package.json +2 -2
package/dist/client.js
CHANGED
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client.ts","../../../node_modules/@blimu/fetch/src/errors.ts","../../../node_modules/@blimu/fetch/src/hooks/registry.ts","../../../node_modules/@blimu/fetch/src/retry/strategies.ts","../../../node_modules/@blimu/fetch/src/streaming/parsers.ts","../../../node_modules/@blimu/fetch/src/utils/environment.ts","../../../node_modules/@blimu/fetch/src/utils/request.ts","../../../node_modules/@blimu/fetch/src/utils/response.ts","../../../node_modules/@blimu/fetch/src/client.ts"],"sourcesContent":["import {\n FetchClient,\n FetchError,\n type FetchClientConfig,\n type AuthStrategy,\n} from '@blimu/fetch';\n\nexport type ClientOption = FetchClientConfig & {\n bearer?: string | (() => string | undefined | Promise<string | undefined>);\n};\n\n// Re-export FetchError for backward compatibility\nexport { FetchError };\n\nexport class CoreClient extends FetchClient {\n constructor(cfg: ClientOption = {}) {\n // Build auth strategies from OpenAPI security schemes\n const authStrategies: AuthStrategy[] = [];\n\n // Extract auth and security scheme properties to avoid passing them to FetchClient\n const { auth: _existingAuth, bearer, ...restCfg } = cfg;\n if (cfg.bearer) {\n const bearerValue = cfg.bearer;\n if (typeof bearerValue === 'string') {\n authStrategies.push({\n type: 'bearer',\n token: () => bearerValue,\n });\n } else if (typeof bearerValue === 'function') {\n authStrategies.push({\n type: 'bearer',\n token: bearerValue as () =>\n | string\n | undefined\n | Promise<string | undefined>,\n });\n }\n } // Build final auth config (merge existing with new strategies)\n const finalAuthStrategies = [\n ...(_existingAuth?.strategies || []),\n ...authStrategies,\n ];\n\n // Build fetchConfig, ensuring auth comes after restCfg spread to override any existing auth\n const fetchConfig: FetchClientConfig = {\n ...restCfg,\n baseURL: cfg.baseURL ?? 'https://api.blimu.dev',\n // Explicitly set auth after restCfg to ensure it's not overwritten\n // (restCfg might have an auth property that we want to replace)\n ...(finalAuthStrategies.length > 0\n ? {\n auth: {\n strategies: finalAuthStrategies,\n },\n }\n : {}),\n // Hooks are passed through directly from FetchClientConfig (no mapping needed)\n };\n\n super(fetchConfig);\n }\n\n async request(\n init: RequestInit & {\n path: string;\n method: string;\n query?: Record<string, any>;\n }\n ) {\n return await super.request(init);\n }\n\n async *requestStream<T = any>(\n init: RequestInit & {\n path: string;\n method: string;\n query?: Record<string, any>;\n contentType: string;\n streamingFormat?: 'sse' | 'ndjson' | 'chunked';\n }\n ): AsyncGenerator<T, void, unknown> {\n yield* super.requestStream(init);\n }\n}\n","/**\n * Base error class for all fetch-related errors\n */\nexport class FetchError<T = unknown> extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly data?: T,\n public readonly headers?: Headers\n ) {\n super(message);\n this.name = \"FetchError\";\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, FetchError);\n }\n }\n}\n\n/**\n * Base class for all 4xx client errors\n */\nexport class ClientError<T = unknown> extends FetchError<T> {\n constructor(message: string, status: number, data?: T, headers?: Headers) {\n super(message, status, data, headers);\n this.name = \"ClientError\";\n }\n}\n\n/**\n * Base class for all 5xx server errors\n */\nexport class ServerError<T = unknown> extends FetchError<T> {\n constructor(message: string, status: number, data?: T, headers?: Headers) {\n super(message, status, data, headers);\n this.name = \"ServerError\";\n }\n}\n\n// 4xx Client Errors\nexport class BadRequestError<T = unknown> extends ClientError<T> {\n constructor(message: string = \"Bad Request\", data?: T, headers?: Headers) {\n super(message, 400, data, headers);\n this.name = \"BadRequestError\";\n }\n}\n\nexport class UnauthorizedError<T = unknown> extends ClientError<T> {\n constructor(message: string = \"Unauthorized\", data?: T, headers?: Headers) {\n super(message, 401, data, headers);\n this.name = \"UnauthorizedError\";\n }\n}\n\nexport class ForbiddenError<T = unknown> extends ClientError<T> {\n constructor(message: string = \"Forbidden\", data?: T, headers?: Headers) {\n super(message, 403, data, headers);\n this.name = \"ForbiddenError\";\n }\n}\n\nexport class NotFoundError<T = unknown> extends ClientError<T> {\n constructor(message: string = \"Not Found\", data?: T, headers?: Headers) {\n super(message, 404, data, headers);\n this.name = \"NotFoundError\";\n }\n}\n\nexport class MethodNotAllowedError<T = unknown> extends ClientError<T> {\n constructor(\n message: string = \"Method Not Allowed\",\n data?: T,\n headers?: Headers\n ) {\n super(message, 405, data, headers);\n this.name = \"MethodNotAllowedError\";\n }\n}\n\nexport class ConflictError<T = unknown> extends ClientError<T> {\n constructor(message: string = \"Conflict\", data?: T, headers?: Headers) {\n super(message, 409, data, headers);\n this.name = \"ConflictError\";\n }\n}\n\nexport class UnprocessableEntityError<T = unknown> extends ClientError<T> {\n constructor(\n message: string = \"Unprocessable Entity\",\n data?: T,\n headers?: Headers\n ) {\n super(message, 422, data, headers);\n this.name = \"UnprocessableEntityError\";\n }\n}\n\nexport class TooManyRequestsError<T = unknown> extends ClientError<T> {\n constructor(\n message: string = \"Too Many Requests\",\n data?: T,\n headers?: Headers\n ) {\n super(message, 429, data, headers);\n this.name = \"TooManyRequestsError\";\n }\n}\n\n// 5xx Server Errors\nexport class InternalServerError<T = unknown> extends ServerError<T> {\n constructor(\n message: string = \"Internal Server Error\",\n data?: T,\n headers?: Headers\n ) {\n super(message, 500, data, headers);\n this.name = \"InternalServerError\";\n }\n}\n\nexport class BadGatewayError<T = unknown> extends ServerError<T> {\n constructor(message: string = \"Bad Gateway\", data?: T, headers?: Headers) {\n super(message, 502, data, headers);\n this.name = \"BadGatewayError\";\n }\n}\n\nexport class ServiceUnavailableError<T = unknown> extends ServerError<T> {\n constructor(\n message: string = \"Service Unavailable\",\n data?: T,\n headers?: Headers\n ) {\n super(message, 503, data, headers);\n this.name = \"ServiceUnavailableError\";\n }\n}\n\nexport class GatewayTimeoutError<T = unknown> extends ServerError<T> {\n constructor(\n message: string = \"Gateway Timeout\",\n data?: T,\n headers?: Headers\n ) {\n super(message, 504, data, headers);\n this.name = \"GatewayTimeoutError\";\n }\n}\n\n/**\n * Factory function to create the appropriate error class based on status code\n */\nexport function createFetchError<T = unknown>(\n status: number,\n message?: string,\n data?: T,\n headers?: Headers\n): FetchError<T> {\n const defaultMessage = message || `HTTP ${status}`;\n\n // 4xx Client Errors\n switch (status) {\n case 400:\n return new BadRequestError(defaultMessage, data, headers);\n case 401:\n return new UnauthorizedError(defaultMessage, data, headers);\n case 403:\n return new ForbiddenError(defaultMessage, data, headers);\n case 404:\n return new NotFoundError(defaultMessage, data, headers);\n case 405:\n return new MethodNotAllowedError(defaultMessage, data, headers);\n case 409:\n return new ConflictError(defaultMessage, data, headers);\n case 422:\n return new UnprocessableEntityError(defaultMessage, data, headers);\n case 429:\n return new TooManyRequestsError(defaultMessage, data, headers);\n // Generic 4xx\n case 402:\n case 406:\n case 407:\n case 408:\n case 410:\n case 411:\n case 412:\n case 413:\n case 414:\n case 415:\n case 416:\n case 417:\n case 418:\n case 421:\n case 423:\n case 424:\n case 425:\n case 426:\n case 428:\n case 431:\n case 451:\n return new ClientError(defaultMessage, status, data, headers);\n\n // 5xx Server Errors\n case 500:\n return new InternalServerError(defaultMessage, data, headers);\n case 502:\n return new BadGatewayError(defaultMessage, data, headers);\n case 503:\n return new ServiceUnavailableError(defaultMessage, data, headers);\n case 504:\n return new GatewayTimeoutError(defaultMessage, data, headers);\n // Generic 5xx\n case 501:\n case 505:\n case 506:\n case 507:\n case 508:\n case 510:\n case 511:\n return new ServerError(defaultMessage, status, data, headers);\n\n default:\n // For any other status code, return base FetchError\n return new FetchError(defaultMessage, status, data, headers);\n }\n}\n","import type { Hook, HookStage, HooksConfig } from \"./types\";\n\n/**\n * Hook registry that manages hooks for different lifecycle stages\n */\nexport class HookRegistry {\n private hooks: Map<HookStage, Hook[]> = new Map();\n\n constructor(config?: HooksConfig) {\n if (config) {\n this.registerFromConfig(config);\n }\n }\n\n /**\n * Register hooks from a configuration object\n */\n registerFromConfig(config: HooksConfig): void {\n for (const [stage, hooks] of Object.entries(config)) {\n if (hooks && Array.isArray(hooks)) {\n for (const hook of hooks) {\n this.register(stage as HookStage, hook);\n }\n }\n }\n }\n\n /**\n * Register a hook for a specific stage\n */\n register(stage: HookStage, hook: Hook): void {\n if (!this.hooks.has(stage)) {\n this.hooks.set(stage, []);\n }\n this.hooks.get(stage)!.push(hook);\n }\n\n /**\n * Remove a specific hook from a stage\n */\n remove(stage: HookStage, hook: Hook): boolean {\n const hooks = this.hooks.get(stage);\n if (!hooks) {\n return false;\n }\n\n const index = hooks.indexOf(hook);\n if (index === -1) {\n return false;\n }\n\n hooks.splice(index, 1);\n return true;\n }\n\n /**\n * Clear all hooks for a specific stage, or all hooks if no stage is provided\n */\n clear(stage?: HookStage): void {\n if (stage) {\n this.hooks.delete(stage);\n } else {\n this.hooks.clear();\n }\n }\n\n /**\n * Get all hooks for a specific stage\n */\n get(stage: HookStage): Hook[] {\n return this.hooks.get(stage) || [];\n }\n\n /**\n * Execute all hooks for a specific stage in registration order\n */\n async execute(stage: HookStage, context: any): Promise<void> {\n const hooks = this.get(stage);\n for (const hook of hooks) {\n await hook(context);\n }\n }\n\n /**\n * Check if any hooks are registered for a stage\n */\n has(stage: HookStage): boolean {\n return this.hooks.has(stage) && this.hooks.get(stage)!.length > 0;\n }\n}\n","import type { RetryStrategyFunction } from \"./types\";\n\n/**\n * Exponential backoff strategy\n * Delay = baseBackoffMs * 2^attempt\n */\nexport const exponentialStrategy: RetryStrategyFunction = (\n attempt: number,\n baseBackoffMs: number\n): number => {\n return baseBackoffMs * Math.pow(2, attempt);\n};\n\n/**\n * Linear backoff strategy\n * Delay = baseBackoffMs * (attempt + 1)\n */\nexport const linearStrategy: RetryStrategyFunction = (\n attempt: number,\n baseBackoffMs: number\n): number => {\n return baseBackoffMs * (attempt + 1);\n};\n\n/**\n * Get the retry strategy function based on the strategy name or function\n */\nexport function getRetryStrategy(\n strategy: \"exponential\" | \"linear\" | RetryStrategyFunction\n): RetryStrategyFunction {\n if (typeof strategy === \"function\") {\n return strategy;\n }\n\n switch (strategy) {\n case \"exponential\":\n return exponentialStrategy;\n case \"linear\":\n return linearStrategy;\n default:\n return exponentialStrategy;\n }\n}\n\n/**\n * Calculate the delay for a retry attempt\n */\nexport function calculateRetryDelay(\n attempt: number,\n strategy: \"exponential\" | \"linear\" | RetryStrategyFunction,\n baseBackoffMs: number\n): number {\n const strategyFn = getRetryStrategy(strategy);\n return strategyFn(attempt, baseBackoffMs);\n}\n","/**\n * Parse Server-Sent Events (SSE) stream\n * Extracts data fields from text/event-stream format\n */\nexport async function* parseSSEStream(\n response: Response\n): AsyncGenerator<string, void, unknown> {\n if (!response.body) {\n return;\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() || \"\"; // Keep incomplete line in buffer\n\n let currentEvent: { type?: string; data?: string; id?: string } = {};\n\n for (const line of lines) {\n if (line.trim() === \"\") {\n // Empty line indicates end of event\n if (currentEvent.data !== undefined) {\n yield currentEvent.data;\n }\n currentEvent = {};\n continue;\n }\n\n const colonIndex = line.indexOf(\":\");\n if (colonIndex === -1) continue;\n\n const field = line.substring(0, colonIndex).trim();\n const value = line.substring(colonIndex + 1).trim();\n\n if (field === \"data\") {\n currentEvent.data = currentEvent.data\n ? currentEvent.data + \"\\n\" + value\n : value;\n } else if (field === \"event\") {\n currentEvent.type = value;\n } else if (field === \"id\") {\n currentEvent.id = value;\n }\n }\n }\n\n // Handle any remaining event in buffer\n if (buffer.trim()) {\n const lines = buffer.split(\"\\n\");\n let currentEvent: { data?: string } = {};\n for (const line of lines) {\n if (line.trim() === \"\" && currentEvent.data !== undefined) {\n yield currentEvent.data;\n currentEvent = {};\n continue;\n }\n const colonIndex = line.indexOf(\":\");\n if (colonIndex !== -1) {\n const field = line.substring(0, colonIndex).trim();\n const value = line.substring(colonIndex + 1).trim();\n if (field === \"data\") {\n currentEvent.data = currentEvent.data\n ? currentEvent.data + \"\\n\" + value\n : value;\n }\n }\n }\n if (currentEvent.data !== undefined) {\n yield currentEvent.data;\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/**\n * Parse NDJSON (Newline-Delimited JSON) stream\n * Yields each JSON object as it arrives\n */\nexport async function* parseNDJSONStream<T = any>(\n response: Response\n): AsyncGenerator<T, void, unknown> {\n if (!response.body) {\n return;\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() || \"\"; // Keep incomplete line in buffer\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed === \"\") continue;\n\n try {\n const parsed = JSON.parse(trimmed) as T;\n yield parsed;\n } catch (error) {\n // Skip invalid JSON lines\n console.warn(\"Skipping invalid JSON line:\", trimmed);\n }\n }\n }\n\n // Handle any remaining line in buffer\n if (buffer.trim()) {\n try {\n const parsed = JSON.parse(buffer.trim()) as T;\n yield parsed;\n } catch (error) {\n // Skip invalid JSON\n console.warn(\"Skipping invalid JSON in buffer:\", buffer.trim());\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/**\n * Parse generic chunked stream\n * Yields raw chunks as strings\n */\nexport async function* parseChunkedStream<T = string>(\n response: Response\n): AsyncGenerator<T, void, unknown> {\n if (!response.body) {\n return;\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value, { stream: true });\n yield chunk as T;\n }\n } finally {\n reader.releaseLock();\n }\n}\n","/**\n * Detects if the code is running in a browser environment\n */\nexport function isBrowser(): boolean {\n return (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as any).window !== \"undefined\" &&\n typeof (globalThis as any).window.document !== \"undefined\"\n );\n}\n\n/**\n * Detects if the code is running in a Node.js environment\n */\nexport function isNode(): boolean {\n return (\n typeof process !== \"undefined\" &&\n process.versions != null &&\n process.versions.node != null\n );\n}\n\n/**\n * Encodes a string to Base64, using the appropriate method for the environment\n * @param str - String to encode\n * @returns Base64 encoded string\n */\nexport function encodeBase64(str: string): string {\n if (isBrowser()) {\n // Browser environment - use btoa\n if (typeof btoa !== \"undefined\") {\n return btoa(str);\n }\n // Fallback for environments where btoa might not be available\n throw new Error(\n \"btoa is not available. This should not happen in a browser environment.\"\n );\n } else {\n // Node.js environment - use Buffer\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(str, \"utf-8\").toString(\"base64\");\n }\n throw new Error(\n \"Buffer is not available. Please ensure you're running in Node.js or provide a polyfill.\"\n );\n }\n}\n\n/**\n * Checks if the native fetch API is available\n * @returns true if fetch is available, false otherwise\n */\nexport function isFetchAvailable(): boolean {\n return typeof fetch !== \"undefined\";\n}\n\n/**\n * Checks if AbortController is available\n * @returns true if AbortController is available, false otherwise\n */\nexport function isAbortControllerAvailable(): boolean {\n return typeof AbortController !== \"undefined\";\n}\n\n/**\n * Gets a helpful error message if fetch is not available\n * @returns Error message with suggestions\n */\nexport function getFetchErrorMessage(): string {\n if (isBrowser()) {\n return \"fetch is not available in this browser. Please use a modern browser or provide a polyfill.\";\n } else {\n return \"fetch is not available. Node.js 22+ includes native fetch. For older versions, please provide a custom fetch implementation (e.g., from 'undici' or 'node-fetch').\";\n }\n}\n","/**\n * Serializes query parameters into a URLSearchParams object\n * Handles arrays, objects, and primitive values\n */\nexport function serializeQueryParams(\n query: Record<string, any>\n): URLSearchParams {\n const params = new URLSearchParams();\n\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null) {\n continue;\n }\n\n if (Array.isArray(value)) {\n // Append each array item\n for (const item of value) {\n if (item !== undefined && item !== null) {\n params.append(key, String(item));\n }\n }\n } else {\n params.set(key, String(value));\n }\n }\n\n return params;\n}\n\n/**\n * Builds a URL with query parameters\n * @param baseUrl - Base URL\n * @param path - Path to append\n * @param query - Query parameters object\n * @returns Complete URL with query string\n */\nexport function buildUrl(\n baseUrl: string,\n path: string,\n query?: Record<string, any>\n): URL {\n // Normalize path - remove trailing slash if present (except for root)\n let normalizedPath = path || '';\n if (normalizedPath.length > 1 && normalizedPath.endsWith('/')) {\n normalizedPath = normalizedPath.slice(0, -1);\n }\n\n // Normalize baseURL to ensure it has a trailing slash if it has a path component\n // This is needed because new URL('path', 'https://example.com/base') creates\n // 'https://example.com/path' (treats base as a file), but\n // new URL('path', 'https://example.com/base/') creates 'https://example.com/base/path' (correct)\n let normalizedBaseUrl = baseUrl || '';\n if (normalizedBaseUrl) {\n try {\n const baseUrlObj = new URL(normalizedBaseUrl);\n // If baseURL has a path component and doesn't end with /, add it\n if (\n baseUrlObj.pathname &&\n baseUrlObj.pathname !== '/' &&\n !normalizedBaseUrl.endsWith('/')\n ) {\n normalizedBaseUrl = normalizedBaseUrl + '/';\n }\n } catch {\n // If baseUrl is not a valid URL, proceed as-is\n }\n }\n\n // If path starts with /, strip it so it appends to baseURL instead of replacing it\n if (normalizedPath.startsWith('/')) {\n normalizedPath = normalizedPath.slice(1);\n }\n\n const url = new URL(normalizedPath, normalizedBaseUrl);\n\n if (query) {\n const params = serializeQueryParams(query);\n // Merge with existing search params\n // Get all unique keys first\n const keys = Array.from(new Set(params.keys()));\n for (const key of keys) {\n // Remove existing values for this key\n url.searchParams.delete(key);\n // Append all values (handles arrays correctly)\n for (const value of params.getAll(key)) {\n url.searchParams.append(key, value);\n }\n }\n }\n\n return url;\n}\n\n/**\n * Determines the content type from a body value\n * @param body - Request body\n * @returns Content type string or undefined\n */\nexport function getContentType(body: unknown): string | undefined {\n if (body === null || body === undefined) {\n return undefined;\n }\n\n if (body instanceof FormData) {\n // FormData sets its own content-type with boundary\n return undefined; // Let the browser set it\n }\n\n if (body instanceof URLSearchParams) {\n return 'application/x-www-form-urlencoded';\n }\n\n if (typeof body === 'string') {\n // Try to detect if it's JSON\n try {\n JSON.parse(body);\n return 'application/json';\n } catch {\n return 'text/plain';\n }\n }\n\n if (typeof body === 'object') {\n return 'application/json';\n }\n\n return undefined;\n}\n\n/**\n * Serializes a request body based on its type\n * @param body - Request body to serialize\n * @param contentType - Optional content type hint to guide serialization\n * @returns Serialized body (string, FormData, Blob, ArrayBuffer, etc.)\n */\nexport function serializeBody(\n body: unknown,\n contentType?: string\n): RequestInit['body'] | null {\n if (body === null || body === undefined) {\n return null;\n }\n\n // If it's already a valid body type, return as-is\n if (\n typeof body === 'string' ||\n body instanceof FormData ||\n body instanceof URLSearchParams ||\n body instanceof Blob ||\n body instanceof ArrayBuffer ||\n ArrayBuffer.isView(body)\n ) {\n return body as RequestInit['body'];\n }\n\n // Handle form-urlencoded: convert object to URLSearchParams\n if (\n contentType === 'application/x-www-form-urlencoded' &&\n typeof body === 'object' &&\n body !== null &&\n !Array.isArray(body)\n ) {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(body)) {\n if (value !== null && value !== undefined) {\n if (Array.isArray(value)) {\n // Handle array values (multiple params with same key)\n for (const item of value) {\n params.append(key, String(item));\n }\n } else {\n params.append(key, String(value));\n }\n }\n }\n return params;\n }\n\n // For objects, serialize to JSON (default)\n if (typeof body === 'object') {\n return JSON.stringify(body);\n }\n\n // For primitives, convert to string\n return String(body);\n}\n","/**\n * Parses a response based on its content type\n * @param response - Fetch Response object\n * @returns Parsed response data\n */\nexport async function parseResponse(response: Response): Promise<any> {\n const contentType = response.headers.get(\"content-type\") || \"\";\n\n if (contentType.includes(\"application/json\")) {\n return await response.json();\n } else if (contentType.startsWith(\"text/\")) {\n return await response.text();\n } else {\n // Binary or unknown content type - return ArrayBuffer\n return await response.arrayBuffer();\n }\n}\n\n/**\n * Checks if a response indicates success (status 200-299)\n * @param response - Fetch Response object\n * @returns true if response is successful\n */\nexport function isSuccessResponse(response: Response): boolean {\n return response.ok;\n}\n","import { createFetchError, FetchError } from './errors';\nimport { HookRegistry } from './hooks';\nimport { calculateRetryDelay } from './retry';\nimport {\n parseSSEStream,\n parseNDJSONStream,\n parseChunkedStream,\n} from './streaming';\nimport type {\n FetchClientConfig,\n RequestOptions,\n StreamingRequestOptions,\n AuthStrategy,\n} from './types';\nimport {\n buildUrl,\n serializeBody,\n getContentType,\n parseResponse,\n isSuccessResponse,\n} from './utils';\nimport {\n isFetchAvailable,\n getFetchErrorMessage,\n encodeBase64,\n} from './utils/environment';\n\n/**\n * Universal HTTP fetch client with hooks, retries, and streaming support\n */\nexport class FetchClient {\n private hookRegistry: HookRegistry;\n private cfg: FetchClientConfig;\n\n constructor(config: FetchClientConfig = {}) {\n this.cfg = config;\n\n // Set default base URL if not provided\n if (!this.cfg.baseURL) {\n this.cfg.baseURL = '';\n }\n\n // Initialize hook registry\n this.hookRegistry = new HookRegistry(this.cfg.hooks);\n\n // Check fetch availability\n if (!isFetchAvailable() && !this.cfg.fetch) {\n throw new Error(getFetchErrorMessage());\n }\n }\n\n /**\n * Add an authentication strategy\n */\n addAuthStrategy(strategy: AuthStrategy): void {\n if (!this.cfg.auth) {\n this.cfg.auth = { strategies: [] };\n }\n this.cfg.auth.strategies.push(strategy);\n }\n\n /**\n * Remove all authentication strategies\n */\n clearAuthStrategies(): void {\n if (this.cfg.auth) {\n this.cfg.auth.strategies = [];\n }\n }\n\n /**\n * Register a hook for a specific lifecycle stage\n */\n useHook(stage: string, hook: any): void {\n this.hookRegistry.register(stage as any, hook);\n }\n\n /**\n * Remove a hook\n */\n removeHook(stage: string, hook: any): boolean {\n return this.hookRegistry.remove(stage as any, hook);\n }\n\n /**\n * Clear hooks for a stage or all hooks\n */\n clearHooks(stage?: string): void {\n this.hookRegistry.clear(stage as any);\n }\n\n /**\n * Make an HTTP request\n */\n async request<T = any>(init: RequestOptions): Promise<T> {\n let url = buildUrl(this.cfg.baseURL || '', init.path, init.query);\n // Create headers, handling both plain objects and Headers instances\n const headers = new Headers(this.cfg.headers || {});\n if (init.headers) {\n if (init.headers instanceof Headers) {\n // Copy from Headers object\n init.headers.forEach((value, key) => {\n headers.set(key, value);\n });\n } else {\n // Merge from plain object\n Object.entries(init.headers).forEach(([key, value]) => {\n headers.set(key, String(value));\n });\n }\n }\n\n // Apply authentication (may modify URL for query-based auth)\n await this.applyAuthentication(headers, url);\n\n // Set content type if body is provided (check before serialization)\n let bodyContentType: string | undefined;\n if (init.body !== undefined) {\n // Check if Content-Type is already set in headers\n bodyContentType = headers.get('Content-Type') || undefined;\n if (!bodyContentType) {\n bodyContentType = getContentType(init.body);\n if (bodyContentType) {\n headers.set('Content-Type', bodyContentType);\n }\n }\n }\n\n const retries = this.cfg.retry?.retries ?? 0;\n const baseBackoff = this.cfg.retry?.backoffMs ?? 300;\n const retryOn = this.cfg.retry?.retryOn ?? [429, 500, 502, 503, 504];\n const retryStrategy = this.cfg.retry?.strategy ?? 'exponential';\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= retries + 1; attempt++) {\n try {\n // Rebuild URL for each attempt (in case query params were modified by auth)\n let attemptUrl = buildUrl(\n this.cfg.baseURL || '',\n init.path,\n init.query\n );\n // Clone headers for each attempt\n const attemptHeaders = new Headers(headers);\n // Re-apply authentication for each attempt\n await this.applyAuthentication(attemptHeaders, attemptUrl);\n return await this.doRequest<T>(\n attemptUrl,\n init,\n attemptHeaders,\n attempt,\n bodyContentType\n );\n } catch (err: any) {\n lastError = err;\n\n // Check if we should retry\n const shouldRetry = this.shouldRetry(err, attempt, retries, retryOn);\n\n if (shouldRetry) {\n // Execute beforeRetry hook\n if (this.hookRegistry.has('beforeRetry')) {\n await this.hookRegistry.execute('beforeRetry', {\n url: url.toString(),\n init: { ...init, headers },\n attempt,\n error: err,\n retryCount: attempt,\n });\n }\n\n // Calculate delay\n const delay = calculateRetryDelay(\n attempt,\n retryStrategy,\n baseBackoff\n );\n await new Promise((resolve) => setTimeout(resolve, delay));\n\n // Execute afterRetry hook\n if (this.hookRegistry.has('afterRetry')) {\n await this.hookRegistry.execute('afterRetry', {\n url: url.toString(),\n init: { ...init, headers },\n attempt,\n error: err,\n retryCount: attempt,\n success: false, // Will be updated if retry succeeds\n });\n }\n\n continue;\n }\n\n // Not retrying - throw the error\n throw err;\n }\n }\n\n throw lastError as any;\n }\n\n /**\n * Make a streaming HTTP request\n */\n async *requestStream<T = any>(\n init: StreamingRequestOptions\n ): AsyncGenerator<T, void, unknown> {\n let url = buildUrl(this.cfg.baseURL || '', init.path, init.query);\n // Create headers, handling both plain objects and Headers instances\n const headers = new Headers(this.cfg.headers || {});\n if (init.headers) {\n if (init.headers instanceof Headers) {\n // Copy from Headers object\n init.headers.forEach((value, key) => {\n headers.set(key, value);\n });\n } else {\n // Merge from plain object\n Object.entries(init.headers).forEach(([key, value]) => {\n headers.set(key, String(value));\n });\n }\n }\n\n // Apply authentication (may modify URL for query-based auth)\n await this.applyAuthentication(headers, url);\n\n // Determine content type for body serialization\n let bodyContentType: string | undefined =\n headers.get('Content-Type') || undefined;\n if (init.contentType && !bodyContentType) {\n bodyContentType = init.contentType;\n headers.set('Content-Type', bodyContentType);\n }\n\n const fetchInit: RequestInit & {\n path: string;\n method: string;\n query?: Record<string, any>;\n headers: Headers;\n } = {\n ...init,\n headers,\n body: serializeBody(init.body, bodyContentType),\n };\n\n // Set credentials from config if provided\n if (this.cfg.credentials !== undefined) {\n fetchInit.credentials = this.cfg.credentials;\n }\n\n // Execute beforeRequest hook\n if (this.hookRegistry.has('beforeRequest')) {\n await this.hookRegistry.execute('beforeRequest', {\n url: url.toString(),\n init: fetchInit,\n attempt: 0,\n });\n }\n\n let controller: AbortController | undefined;\n let timeoutId: any;\n const existingSignal = fetchInit.signal;\n\n // Setup timeout\n if (this.cfg.timeoutMs && typeof AbortController !== 'undefined') {\n controller = new AbortController();\n if (existingSignal) {\n if (existingSignal.aborted) {\n controller.abort();\n } else {\n existingSignal.addEventListener('abort', () => {\n controller?.abort();\n });\n }\n }\n fetchInit.signal = controller.signal;\n timeoutId = setTimeout(() => {\n controller?.abort();\n // Execute onTimeout hook\n if (this.hookRegistry.has('onTimeout')) {\n this.hookRegistry.execute('onTimeout', {\n url: url.toString(),\n init: fetchInit,\n attempt: 0,\n timeoutMs: this.cfg.timeoutMs!,\n });\n }\n }, this.cfg.timeoutMs);\n }\n\n try {\n const fetchFn = this.cfg.fetch || fetch;\n const res = await fetchFn(url.toString(), fetchInit);\n\n // Execute afterRequest hook\n if (this.hookRegistry.has('afterRequest')) {\n await this.hookRegistry.execute('afterRequest', {\n url: url.toString(),\n init: fetchInit,\n attempt: 0,\n response: res,\n });\n }\n\n if (!res.ok) {\n const parsed = await parseResponse(res);\n const error = createFetchError(\n res.status,\n parsed?.message || `HTTP ${res.status}`,\n parsed,\n res.headers\n );\n\n // Execute onError hook\n if (this.hookRegistry.has('onError')) {\n await this.hookRegistry.execute('onError', {\n url: url.toString(),\n init: fetchInit,\n attempt: 0,\n error,\n });\n }\n\n throw error;\n }\n\n // Execute onStreamStart hook\n if (this.hookRegistry.has('onStreamStart')) {\n await this.hookRegistry.execute('onStreamStart', {\n url: url.toString(),\n init: fetchInit,\n attempt: 0,\n response: res,\n });\n }\n\n // Route to appropriate parser based on streaming format\n const streamingFormat = init.streamingFormat || 'chunked';\n\n if (streamingFormat === 'sse') {\n for await (const chunk of parseSSEStream(res)) {\n let transformedChunk = chunk;\n // Execute onStreamChunk hook if present\n if (this.hookRegistry.has('onStreamChunk')) {\n await this.hookRegistry.execute('onStreamChunk', {\n url: url.toString(),\n init: fetchInit,\n attempt: 0,\n chunk,\n });\n }\n yield transformedChunk as T;\n }\n } else if (streamingFormat === 'ndjson') {\n for await (const chunk of parseNDJSONStream<T>(res)) {\n let transformedChunk = chunk;\n // Execute onStreamChunk hook if present\n if (this.hookRegistry.has('onStreamChunk')) {\n await this.hookRegistry.execute('onStreamChunk', {\n url: url.toString(),\n init: fetchInit,\n attempt: 0,\n chunk,\n });\n }\n yield transformedChunk as T;\n }\n } else {\n // Generic chunked streaming\n for await (const chunk of parseChunkedStream<T>(res)) {\n let transformedChunk = chunk;\n // Execute onStreamChunk hook if present\n if (this.hookRegistry.has('onStreamChunk')) {\n await this.hookRegistry.execute('onStreamChunk', {\n url: url.toString(),\n init: fetchInit,\n attempt: 0,\n chunk,\n });\n }\n yield transformedChunk as T;\n }\n }\n\n // Execute onStreamEnd hook\n if (this.hookRegistry.has('onStreamEnd')) {\n await this.hookRegistry.execute('onStreamEnd', {\n url: url.toString(),\n init: fetchInit,\n attempt: 0,\n response: res,\n });\n }\n } catch (err) {\n // Execute onError hook\n if (this.hookRegistry.has('onError')) {\n await this.hookRegistry.execute('onError', {\n url: url.toString(),\n init: fetchInit,\n attempt: 0,\n error: err,\n });\n }\n throw err;\n } finally {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n }\n\n /**\n * Internal method to execute a single request attempt\n */\n private async doRequest<T>(\n url: URL,\n init: RequestOptions,\n baseHeaders: Headers,\n attempt: number,\n contentType?: string\n ): Promise<T> {\n // Headers are already cloned and auth is already applied\n const requestHeaders = baseHeaders;\n\n const fetchInit: RequestInit & {\n path: string;\n method: string;\n query?: Record<string, any>;\n headers: Headers;\n } = {\n ...init,\n headers: requestHeaders,\n body: serializeBody(init.body, contentType),\n };\n\n // Set credentials from config if provided\n if (this.cfg.credentials !== undefined) {\n fetchInit.credentials = this.cfg.credentials;\n }\n\n // Execute beforeRequest hook\n if (this.hookRegistry.has('beforeRequest')) {\n await this.hookRegistry.execute('beforeRequest', {\n url: url.toString(),\n init: fetchInit,\n attempt,\n });\n }\n\n let controller: AbortController | undefined;\n let timeoutId: any;\n const existingSignal = fetchInit.signal;\n\n // Setup timeout\n if (this.cfg.timeoutMs && typeof AbortController !== 'undefined') {\n controller = new AbortController();\n if (existingSignal) {\n if (existingSignal.aborted) {\n controller.abort();\n } else {\n existingSignal.addEventListener('abort', () => {\n controller?.abort();\n });\n }\n }\n fetchInit.signal = controller.signal;\n timeoutId = setTimeout(() => {\n controller?.abort();\n // Execute onTimeout hook\n if (this.hookRegistry.has('onTimeout')) {\n this.hookRegistry.execute('onTimeout', {\n url: url.toString(),\n init: fetchInit,\n attempt,\n timeoutMs: this.cfg.timeoutMs!,\n });\n }\n }, this.cfg.timeoutMs);\n }\n\n try {\n const fetchFn = this.cfg.fetch || fetch;\n const res = await fetchFn(url.toString(), fetchInit);\n\n // Execute afterRequest hook\n if (this.hookRegistry.has('afterRequest')) {\n await this.hookRegistry.execute('afterRequest', {\n url: url.toString(),\n init: fetchInit,\n attempt,\n response: res,\n });\n }\n\n const parsed = await parseResponse(res);\n\n // Execute afterResponse hook\n if (this.hookRegistry.has('afterResponse')) {\n await this.hookRegistry.execute('afterResponse', {\n url: url.toString(),\n init: fetchInit,\n attempt,\n response: res,\n data: parsed,\n });\n }\n\n if (!isSuccessResponse(res)) {\n const error = createFetchError(\n res.status,\n parsed?.message || `HTTP ${res.status}`,\n parsed,\n res.headers\n );\n\n // Execute onError hook\n if (this.hookRegistry.has('onError')) {\n await this.hookRegistry.execute('onError', {\n url: url.toString(),\n init: fetchInit,\n attempt,\n error,\n });\n }\n\n throw error;\n }\n\n return parsed as T;\n } catch (err) {\n // Execute onError hook\n if (this.hookRegistry.has('onError')) {\n await this.hookRegistry.execute('onError', {\n url: url.toString(),\n init: fetchInit,\n attempt,\n error: err,\n });\n }\n\n // Re-throw with proper error type if needed\n if (err instanceof DOMException) {\n throw err;\n }\n if (err instanceof FetchError) {\n throw err;\n }\n\n // For network errors, try to extract status if available\n const status = (err as any)?.status as number | undefined;\n const statusCode = typeof status === 'number' ? status : 0;\n if (typeof err === 'string') {\n throw createFetchError(statusCode, err);\n }\n throw createFetchError(\n statusCode,\n (err as Error)?.message || 'Network error'\n );\n } finally {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n }\n\n /**\n * Apply authentication strategies\n */\n private async applyAuthentication(headers: Headers, url: URL): Promise<void> {\n if (!this.cfg.auth?.strategies) {\n return;\n }\n\n for (const strategy of this.cfg.auth.strategies) {\n await this.applyAuthStrategy(strategy, headers, url);\n }\n }\n\n /**\n * Apply a single authentication strategy\n */\n private async applyAuthStrategy(\n strategy: AuthStrategy,\n headers: Headers,\n url: URL\n ): Promise<void> {\n switch (strategy.type) {\n case 'bearer': {\n const token =\n typeof strategy.token === 'function'\n ? await strategy.token()\n : strategy.token;\n if (token != null) {\n const headerName = strategy.headerName || 'Authorization';\n headers.set(headerName, `Bearer ${String(token)}`);\n }\n break;\n }\n\n case 'basic': {\n const encoded = encodeBase64(\n `${strategy.username}:${strategy.password}`\n );\n headers.set('Authorization', `Basic ${encoded}`);\n break;\n }\n\n case 'apiKey': {\n const key =\n typeof strategy.key === 'function'\n ? await strategy.key()\n : strategy.key;\n if (key != null) {\n switch (strategy.location) {\n case 'header':\n headers.set(strategy.name, String(key));\n break;\n case 'query':\n url.searchParams.set(strategy.name, String(key));\n break;\n case 'cookie':\n headers.set('Cookie', `${strategy.name}=${String(key)}`);\n break;\n }\n }\n break;\n }\n\n case 'custom':\n await strategy.apply(headers, url);\n break;\n }\n }\n\n /**\n * Determine if an error should be retried\n */\n private shouldRetry(\n error: unknown,\n attempt: number,\n maxRetries: number,\n retryOn: number[]\n ): boolean {\n if (attempt >= maxRetries) {\n return false;\n }\n\n // Check custom retry condition\n if (this.cfg.retry?.retryOnError) {\n return this.cfg.retry.retryOnError(error);\n }\n\n // Check if it's a FetchError with a retryable status code\n if (error instanceof FetchError) {\n return retryOn.includes(error.status);\n }\n\n // Network errors (no status code) should be retried\n return true;\n }\n}\n"],"mappings":"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","names":["FetchError","Error","message","status","data","headers","name","captureStackTrace","ClientError","ServerError","BadRequestError","UnauthorizedError","ForbiddenError","NotFoundError","MethodNotAllowedError","ConflictError","UnprocessableEntityError","TooManyRequestsError","InternalServerError","BadGatewayError","ServiceUnavailableError","GatewayTimeoutError","createFetchError","defaultMessage","HookRegistry","hooks","Map","config","registerFromConfig","stage","Object","entries","Array","isArray","hook","register","has","set","get","push","remove","index","indexOf","splice","clear","delete","execute","context","length","exponentialStrategy","attempt","baseBackoffMs","Math","pow","linearStrategy","getRetryStrategy","strategy","calculateRetryDelay","strategyFn","parseSSEStream","response","body","reader","getReader","decoder","TextDecoder","buffer","done","value","read","decode","stream","lines","split","pop","currentEvent","line","trim","undefined","colonIndex","field","substring","type","id","releaseLock","parseNDJSONStream","trimmed","parsed","JSON","parse","error","console","warn","parseChunkedStream","chunk","isBrowser","globalThis","window","document","isNode","process","versions","node","encodeBase64","str","btoa","Buffer","from","toString","isFetchAvailable","fetch","isAbortControllerAvailable","AbortController","getFetchErrorMessage","serializeQueryParams","query","params","URLSearchParams","key","item","append","String","buildUrl","baseUrl","path","normalizedPath","endsWith","slice","normalizedBaseUrl","baseUrlObj","URL","pathname","startsWith","url","keys","Set","searchParams","getAll","getContentType","FormData","serializeBody","contentType","Blob","ArrayBuffer","isView","stringify","parseResponse","includes","json","text","arrayBuffer","isSuccessResponse","ok","FetchClient","hookRegistry","cfg","baseURL","addAuthStrategy","auth","strategies","clearAuthStrategies","useHook","removeHook","clearHooks","request","init","Headers","forEach","applyAuthentication","bodyContentType","retries","retry","baseBackoff","backoffMs","retryOn","retryStrategy","lastError","attemptUrl","attemptHeaders","doRequest","err","shouldRetry","retryCount","delay","Promise","resolve","setTimeout","success","requestStream","fetchInit","credentials","controller","timeoutId","existingSignal","signal","timeoutMs","aborted","abort","addEventListener","fetchFn","res","streamingFormat","transformedChunk","clearTimeout","baseHeaders","requestHeaders","DOMException","statusCode","applyAuthStrategy","token","headerName","encoded","username","password","location","apply","maxRetries","retryOnError"]}
|
|
1
|
+
{"version":3,"sources":["../src/client.ts","../../../node_modules/@blimu/fetch/src/errors.ts","../../../node_modules/@blimu/fetch/src/hooks/registry.ts","../../../node_modules/@blimu/fetch/src/retry/strategies.ts","../../../node_modules/@blimu/fetch/src/streaming/parsers.ts","../../../node_modules/@blimu/fetch/src/utils/environment.ts","../../../node_modules/@blimu/fetch/src/utils/request.ts","../../../node_modules/@blimu/fetch/src/utils/response.ts","../../../node_modules/@blimu/fetch/src/client.ts"],"sourcesContent":["import {\n FetchClient,\n FetchError,\n type FetchClientConfig,\n type AuthStrategy,\n} from '@blimu/fetch';\n\nexport type ClientOption = FetchClientConfig & {\n bearer?: string | (() => string | undefined | Promise<string | undefined>);\n};\n\n// Re-export FetchError for backward compatibility\nexport { FetchError };\n\nexport class CoreClient extends FetchClient {\n constructor(cfg: ClientOption = {}) {\n // Build auth strategies from OpenAPI security schemes\n const authStrategies: AuthStrategy[] = [];\n\n // Extract auth and security scheme properties to avoid passing them to FetchClient\n const { auth: _existingAuth, bearer, ...restCfg } = cfg;\n if (cfg.bearer) {\n const bearerValue = cfg.bearer;\n if (typeof bearerValue === 'string') {\n authStrategies.push({\n type: 'bearer',\n token: () => bearerValue,\n });\n } else if (typeof bearerValue === 'function') {\n authStrategies.push({\n type: 'bearer',\n token: bearerValue as () =>\n | string\n | undefined\n | Promise<string | undefined>,\n });\n }\n } // Build final auth config (merge existing with new strategies)\n const finalAuthStrategies = [\n ...(_existingAuth?.strategies || []),\n ...authStrategies,\n ];\n\n // Build fetchConfig, ensuring auth comes after restCfg spread to override any existing auth\n const fetchConfig: FetchClientConfig = {\n ...restCfg,\n baseURL: cfg.baseURL ?? 'https://api.blimu.dev',\n // Explicitly set auth after restCfg to ensure it's not overwritten\n // (restCfg might have an auth property that we want to replace)\n ...(finalAuthStrategies.length > 0\n ? {\n auth: {\n strategies: finalAuthStrategies,\n },\n }\n : {}),\n // Hooks are passed through directly from FetchClientConfig (no mapping needed)\n };\n\n super(fetchConfig);\n }\n\n async request(\n init: RequestInit & {\n path: string;\n method: string;\n query?: Record<string, any>;\n }\n ) {\n return await super.request(init);\n }\n\n async *requestStream<T = any>(\n init: RequestInit & {\n path: string;\n method: string;\n query?: Record<string, any>;\n contentType: string;\n streamingFormat?: 'sse' | 'ndjson' | 'chunked';\n }\n ): AsyncGenerator<T, void, unknown> {\n yield* super.requestStream(init);\n }\n}\n","/**\n * Base error class for all fetch-related errors\n */\nexport class FetchError<T = unknown> extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly data?: T,\n public readonly headers?: Headers\n ) {\n super(message);\n this.name = \"FetchError\";\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, FetchError);\n }\n }\n}\n\n/**\n * Base class for all 4xx client errors\n */\nexport class ClientError<T = unknown> extends FetchError<T> {\n constructor(message: string, status: number, data?: T, headers?: Headers) {\n super(message, status, data, headers);\n this.name = \"ClientError\";\n }\n}\n\n/**\n * Base class for all 5xx server errors\n */\nexport class ServerError<T = unknown> extends FetchError<T> {\n constructor(message: string, status: number, data?: T, headers?: Headers) {\n super(message, status, data, headers);\n this.name = \"ServerError\";\n }\n}\n\n// 4xx Client Errors\nexport class BadRequestError<T = unknown> extends ClientError<T> {\n constructor(message: string = \"Bad Request\", data?: T, headers?: Headers) {\n super(message, 400, data, headers);\n this.name = \"BadRequestError\";\n }\n}\n\nexport class UnauthorizedError<T = unknown> extends ClientError<T> {\n constructor(message: string = \"Unauthorized\", data?: T, headers?: Headers) {\n super(message, 401, data, headers);\n this.name = \"UnauthorizedError\";\n }\n}\n\nexport class ForbiddenError<T = unknown> extends ClientError<T> {\n constructor(message: string = \"Forbidden\", data?: T, headers?: Headers) {\n super(message, 403, data, headers);\n this.name = \"ForbiddenError\";\n }\n}\n\nexport class NotFoundError<T = unknown> extends ClientError<T> {\n constructor(message: string = \"Not Found\", data?: T, headers?: Headers) {\n super(message, 404, data, headers);\n this.name = \"NotFoundError\";\n }\n}\n\nexport class MethodNotAllowedError<T = unknown> extends ClientError<T> {\n constructor(\n message: string = \"Method Not Allowed\",\n data?: T,\n headers?: Headers\n ) {\n super(message, 405, data, headers);\n this.name = \"MethodNotAllowedError\";\n }\n}\n\nexport class ConflictError<T = unknown> extends ClientError<T> {\n constructor(message: string = \"Conflict\", data?: T, headers?: Headers) {\n super(message, 409, data, headers);\n this.name = \"ConflictError\";\n }\n}\n\nexport class UnprocessableEntityError<T = unknown> extends ClientError<T> {\n constructor(\n message: string = \"Unprocessable Entity\",\n data?: T,\n headers?: Headers\n ) {\n super(message, 422, data, headers);\n this.name = \"UnprocessableEntityError\";\n }\n}\n\nexport class TooManyRequestsError<T = unknown> extends ClientError<T> {\n constructor(\n message: string = \"Too Many Requests\",\n data?: T,\n headers?: Headers\n ) {\n super(message, 429, data, headers);\n this.name = \"TooManyRequestsError\";\n }\n}\n\n// 5xx Server Errors\nexport class InternalServerError<T = unknown> extends ServerError<T> {\n constructor(\n message: string = \"Internal Server Error\",\n data?: T,\n headers?: Headers\n ) {\n super(message, 500, data, headers);\n this.name = \"InternalServerError\";\n }\n}\n\nexport class BadGatewayError<T = unknown> extends ServerError<T> {\n constructor(message: string = \"Bad Gateway\", data?: T, headers?: Headers) {\n super(message, 502, data, headers);\n this.name = \"BadGatewayError\";\n }\n}\n\nexport class ServiceUnavailableError<T = unknown> extends ServerError<T> {\n constructor(\n message: string = \"Service Unavailable\",\n data?: T,\n headers?: Headers\n ) {\n super(message, 503, data, headers);\n this.name = \"ServiceUnavailableError\";\n }\n}\n\nexport class GatewayTimeoutError<T = unknown> extends ServerError<T> {\n constructor(\n message: string = \"Gateway Timeout\",\n data?: T,\n headers?: Headers\n ) {\n super(message, 504, data, headers);\n this.name = \"GatewayTimeoutError\";\n }\n}\n\n/**\n * Factory function to create the appropriate error class based on status code\n */\nexport function createFetchError<T = unknown>(\n status: number,\n message?: string,\n data?: T,\n headers?: Headers\n): FetchError<T> {\n const defaultMessage = message || `HTTP ${status}`;\n\n // 4xx Client Errors\n switch (status) {\n case 400:\n return new BadRequestError(defaultMessage, data, headers);\n case 401:\n return new UnauthorizedError(defaultMessage, data, headers);\n case 403:\n return new ForbiddenError(defaultMessage, data, headers);\n case 404:\n return new NotFoundError(defaultMessage, data, headers);\n case 405:\n return new MethodNotAllowedError(defaultMessage, data, headers);\n case 409:\n return new ConflictError(defaultMessage, data, headers);\n case 422:\n return new UnprocessableEntityError(defaultMessage, data, headers);\n case 429:\n return new TooManyRequestsError(defaultMessage, data, headers);\n // Generic 4xx\n case 402:\n case 406:\n case 407:\n case 408:\n case 410:\n case 411:\n case 412:\n case 413:\n case 414:\n case 415:\n case 416:\n case 417:\n case 418:\n case 421:\n case 423:\n case 424:\n case 425:\n case 426:\n case 428:\n case 431:\n case 451:\n return new ClientError(defaultMessage, status, data, headers);\n\n // 5xx Server Errors\n case 500:\n return new InternalServerError(defaultMessage, data, headers);\n case 502:\n return new BadGatewayError(defaultMessage, data, headers);\n case 503:\n return new ServiceUnavailableError(defaultMessage, data, headers);\n case 504:\n return new GatewayTimeoutError(defaultMessage, data, headers);\n // Generic 5xx\n case 501:\n case 505:\n case 506:\n case 507:\n case 508:\n case 510:\n case 511:\n return new ServerError(defaultMessage, status, data, headers);\n\n default:\n // For any other status code, return base FetchError\n return new FetchError(defaultMessage, status, data, headers);\n }\n}\n","import type { Hook, HookStage, HooksConfig } from \"./types\";\n\n/**\n * Hook registry that manages hooks for different lifecycle stages\n */\nexport class HookRegistry {\n private hooks: Map<HookStage, Hook[]> = new Map();\n\n constructor(config?: HooksConfig) {\n if (config) {\n this.registerFromConfig(config);\n }\n }\n\n /**\n * Register hooks from a configuration object\n */\n registerFromConfig(config: HooksConfig): void {\n for (const [stage, hooks] of Object.entries(config)) {\n if (hooks && Array.isArray(hooks)) {\n for (const hook of hooks) {\n this.register(stage as HookStage, hook);\n }\n }\n }\n }\n\n /**\n * Register a hook for a specific stage\n */\n register(stage: HookStage, hook: Hook): void {\n if (!this.hooks.has(stage)) {\n this.hooks.set(stage, []);\n }\n this.hooks.get(stage)!.push(hook);\n }\n\n /**\n * Remove a specific hook from a stage\n */\n remove(stage: HookStage, hook: Hook): boolean {\n const hooks = this.hooks.get(stage);\n if (!hooks) {\n return false;\n }\n\n const index = hooks.indexOf(hook);\n if (index === -1) {\n return false;\n }\n\n hooks.splice(index, 1);\n return true;\n }\n\n /**\n * Clear all hooks for a specific stage, or all hooks if no stage is provided\n */\n clear(stage?: HookStage): void {\n if (stage) {\n this.hooks.delete(stage);\n } else {\n this.hooks.clear();\n }\n }\n\n /**\n * Get all hooks for a specific stage\n */\n get(stage: HookStage): Hook[] {\n return this.hooks.get(stage) || [];\n }\n\n /**\n * Execute all hooks for a specific stage in registration order\n */\n async execute(stage: HookStage, context: any): Promise<void> {\n const hooks = this.get(stage);\n for (const hook of hooks) {\n await hook(context);\n }\n }\n\n /**\n * Check if any hooks are registered for a stage\n */\n has(stage: HookStage): boolean {\n return this.hooks.has(stage) && this.hooks.get(stage)!.length > 0;\n }\n}\n","import type { RetryStrategyFunction } from \"./types\";\n\n/**\n * Exponential backoff strategy\n * Delay = baseBackoffMs * 2^attempt\n */\nexport const exponentialStrategy: RetryStrategyFunction = (\n attempt: number,\n baseBackoffMs: number\n): number => {\n return baseBackoffMs * Math.pow(2, attempt);\n};\n\n/**\n * Linear backoff strategy\n * Delay = baseBackoffMs * (attempt + 1)\n */\nexport const linearStrategy: RetryStrategyFunction = (\n attempt: number,\n baseBackoffMs: number\n): number => {\n return baseBackoffMs * (attempt + 1);\n};\n\n/**\n * Get the retry strategy function based on the strategy name or function\n */\nexport function getRetryStrategy(\n strategy: \"exponential\" | \"linear\" | RetryStrategyFunction\n): RetryStrategyFunction {\n if (typeof strategy === \"function\") {\n return strategy;\n }\n\n switch (strategy) {\n case \"exponential\":\n return exponentialStrategy;\n case \"linear\":\n return linearStrategy;\n default:\n return exponentialStrategy;\n }\n}\n\n/**\n * Calculate the delay for a retry attempt\n */\nexport function calculateRetryDelay(\n attempt: number,\n strategy: \"exponential\" | \"linear\" | RetryStrategyFunction,\n baseBackoffMs: number\n): number {\n const strategyFn = getRetryStrategy(strategy);\n return strategyFn(attempt, baseBackoffMs);\n}\n","/**\n * Parse Server-Sent Events (SSE) stream\n * Extracts data fields from text/event-stream format\n */\nexport async function* parseSSEStream(\n response: Response\n): AsyncGenerator<string, void, unknown> {\n if (!response.body) {\n return;\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() || \"\"; // Keep incomplete line in buffer\n\n let currentEvent: { type?: string; data?: string; id?: string } = {};\n\n for (const line of lines) {\n if (line.trim() === \"\") {\n // Empty line indicates end of event\n if (currentEvent.data !== undefined) {\n yield currentEvent.data;\n }\n currentEvent = {};\n continue;\n }\n\n const colonIndex = line.indexOf(\":\");\n if (colonIndex === -1) continue;\n\n const field = line.substring(0, colonIndex).trim();\n const value = line.substring(colonIndex + 1).trim();\n\n if (field === \"data\") {\n currentEvent.data = currentEvent.data\n ? currentEvent.data + \"\\n\" + value\n : value;\n } else if (field === \"event\") {\n currentEvent.type = value;\n } else if (field === \"id\") {\n currentEvent.id = value;\n }\n }\n }\n\n // Handle any remaining event in buffer\n if (buffer.trim()) {\n const lines = buffer.split(\"\\n\");\n let currentEvent: { data?: string } = {};\n for (const line of lines) {\n if (line.trim() === \"\" && currentEvent.data !== undefined) {\n yield currentEvent.data;\n currentEvent = {};\n continue;\n }\n const colonIndex = line.indexOf(\":\");\n if (colonIndex !== -1) {\n const field = line.substring(0, colonIndex).trim();\n const value = line.substring(colonIndex + 1).trim();\n if (field === \"data\") {\n currentEvent.data = currentEvent.data\n ? currentEvent.data + \"\\n\" + value\n : value;\n }\n }\n }\n if (currentEvent.data !== undefined) {\n yield currentEvent.data;\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/**\n * Parse NDJSON (Newline-Delimited JSON) stream\n * Yields each JSON object as it arrives\n */\nexport async function* parseNDJSONStream<T = any>(\n response: Response\n): AsyncGenerator<T, void, unknown> {\n if (!response.body) {\n return;\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() || \"\"; // Keep incomplete line in buffer\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed === \"\") continue;\n\n try {\n const parsed = JSON.parse(trimmed) as T;\n yield parsed;\n } catch (error) {\n // Skip invalid JSON lines\n console.warn(\"Skipping invalid JSON line:\", trimmed);\n }\n }\n }\n\n // Handle any remaining line in buffer\n if (buffer.trim()) {\n try {\n const parsed = JSON.parse(buffer.trim()) as T;\n yield parsed;\n } catch (error) {\n // Skip invalid JSON\n console.warn(\"Skipping invalid JSON in buffer:\", buffer.trim());\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/**\n * Parse generic chunked stream\n * Yields raw chunks as strings\n */\nexport async function* parseChunkedStream<T = string>(\n response: Response\n): AsyncGenerator<T, void, unknown> {\n if (!response.body) {\n return;\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value, { stream: true });\n yield chunk as T;\n }\n } finally {\n reader.releaseLock();\n }\n}\n","/**\n * Detects if the code is running in a browser environment\n */\nexport function isBrowser(): boolean {\n return (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as any).window !== \"undefined\" &&\n typeof (globalThis as any).window.document !== \"undefined\"\n );\n}\n\n/**\n * Detects if the code is running in a Node.js environment\n */\nexport function isNode(): boolean {\n return (\n typeof process !== \"undefined\" &&\n process.versions != null &&\n process.versions.node != null\n );\n}\n\n/**\n * Encodes a string to Base64, using the appropriate method for the environment\n * @param str - String to encode\n * @returns Base64 encoded string\n */\nexport function encodeBase64(str: string): string {\n if (isBrowser()) {\n // Browser environment - use btoa\n if (typeof btoa !== \"undefined\") {\n return btoa(str);\n }\n // Fallback for environments where btoa might not be available\n throw new Error(\n \"btoa is not available. This should not happen in a browser environment.\"\n );\n } else {\n // Node.js environment - use Buffer\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(str, \"utf-8\").toString(\"base64\");\n }\n throw new Error(\n \"Buffer is not available. Please ensure you're running in Node.js or provide a polyfill.\"\n );\n }\n}\n\n/**\n * Checks if the native fetch API is available\n * @returns true if fetch is available, false otherwise\n */\nexport function isFetchAvailable(): boolean {\n return typeof fetch !== \"undefined\";\n}\n\n/**\n * Checks if AbortController is available\n * @returns true if AbortController is available, false otherwise\n */\nexport function isAbortControllerAvailable(): boolean {\n return typeof AbortController !== \"undefined\";\n}\n\n/**\n * Gets a helpful error message if fetch is not available\n * @returns Error message with suggestions\n */\nexport function getFetchErrorMessage(): string {\n if (isBrowser()) {\n return \"fetch is not available in this browser. Please use a modern browser or provide a polyfill.\";\n } else {\n return \"fetch is not available. Node.js 22+ includes native fetch. For older versions, please provide a custom fetch implementation (e.g., from 'undici' or 'node-fetch').\";\n }\n}\n","/**\n * Serializes query parameters into a URLSearchParams object\n * Handles arrays, objects, and primitive values\n */\nexport function serializeQueryParams(\n query: Record<string, any>\n): URLSearchParams {\n const params = new URLSearchParams();\n\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null) {\n continue;\n }\n\n if (Array.isArray(value)) {\n // Append each array item\n for (const item of value) {\n if (item !== undefined && item !== null) {\n params.append(key, String(item));\n }\n }\n } else {\n params.set(key, String(value));\n }\n }\n\n return params;\n}\n\n/**\n * Builds a URL with query parameters\n * @param baseUrl - Base URL\n * @param path - Path to append\n * @param query - Query parameters object\n * @returns Complete URL with query string\n */\nexport function buildUrl(\n baseUrl: string,\n path: string,\n query?: Record<string, any>\n): URL {\n // Normalize path - remove trailing slash if present (except for root)\n let normalizedPath = path || '';\n if (normalizedPath.length > 1 && normalizedPath.endsWith('/')) {\n normalizedPath = normalizedPath.slice(0, -1);\n }\n\n // Normalize baseURL to ensure it has a trailing slash if it has a path component\n // This is needed because new URL('path', 'https://example.com/base') creates\n // 'https://example.com/path' (treats base as a file), but\n // new URL('path', 'https://example.com/base/') creates 'https://example.com/base/path' (correct)\n let normalizedBaseUrl = baseUrl || '';\n if (normalizedBaseUrl) {\n try {\n const baseUrlObj = new URL(normalizedBaseUrl);\n // If baseURL has a path component and doesn't end with /, add it\n if (\n baseUrlObj.pathname &&\n baseUrlObj.pathname !== '/' &&\n !normalizedBaseUrl.endsWith('/')\n ) {\n normalizedBaseUrl = normalizedBaseUrl + '/';\n }\n } catch {\n // If baseUrl is not a valid URL, proceed as-is\n }\n }\n\n // If path starts with /, strip it so it appends to baseURL instead of replacing it\n if (normalizedPath.startsWith('/')) {\n normalizedPath = normalizedPath.slice(1);\n }\n\n const url = new URL(normalizedPath, normalizedBaseUrl);\n\n if (query) {\n const params = serializeQueryParams(query);\n // Merge with existing search params\n // Get all unique keys first\n const keys = Array.from(new Set(params.keys()));\n for (const key of keys) {\n // Remove existing values for this key\n url.searchParams.delete(key);\n // Append all values (handles arrays correctly)\n for (const value of params.getAll(key)) {\n url.searchParams.append(key, value);\n }\n }\n }\n\n return url;\n}\n\n/**\n * Determines the content type from a body value\n * @param body - Request body\n * @returns Content type string or undefined\n */\nexport function getContentType(body: unknown): string | undefined {\n if (body === null || body === undefined) {\n return undefined;\n }\n\n if (body instanceof FormData) {\n // FormData sets its own content-type with boundary\n return undefined; // Let the browser set it\n }\n\n if (body instanceof URLSearchParams) {\n return 'application/x-www-form-urlencoded';\n }\n\n if (typeof body === 'string') {\n // Try to detect if it's JSON\n try {\n JSON.parse(body);\n return 'application/json';\n } catch {\n return 'text/plain';\n }\n }\n\n if (typeof body === 'object') {\n return 'application/json';\n }\n\n return undefined;\n}\n\n/**\n * Serializes a request body based on its type\n * @param body - Request body to serialize\n * @param contentType - Optional content type hint to guide serialization\n * @returns Serialized body (string, FormData, Blob, ArrayBuffer, etc.)\n */\nexport function serializeBody(\n body: unknown,\n contentType?: string\n): RequestInit['body'] | null {\n if (body === null || body === undefined) {\n return null;\n }\n\n // If it's already a valid body type, return as-is\n if (\n typeof body === 'string' ||\n body instanceof FormData ||\n body instanceof URLSearchParams ||\n body instanceof Blob ||\n body instanceof ArrayBuffer ||\n ArrayBuffer.isView(body)\n ) {\n return body as RequestInit['body'];\n }\n\n // Handle form-urlencoded: convert object to URLSearchParams\n if (\n contentType === 'application/x-www-form-urlencoded' &&\n typeof body === 'object' &&\n body !== null &&\n !Array.isArray(body)\n ) {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(body)) {\n if (value !== null && value !== undefined) {\n if (Array.isArray(value)) {\n // Handle array values (multiple params with same key)\n for (const item of value) {\n params.append(key, String(item));\n }\n } else {\n params.append(key, String(value));\n }\n }\n }\n return params;\n }\n\n // For objects, serialize to JSON (default)\n if (typeof body === 'object') {\n return JSON.stringify(body);\n }\n\n // For primitives, convert to string\n return String(body);\n}\n","/**\n * Parses a response based on its content type\n * @param response - Fetch Response object\n * @returns Parsed response data\n */\nexport async function parseResponse(response: Response): Promise<any> {\n const contentType = response.headers.get(\"content-type\") || \"\";\n\n if (contentType.includes(\"application/json\")) {\n return await response.json();\n } else if (contentType.startsWith(\"text/\")) {\n return await response.text();\n } else {\n // Binary or unknown content type - return ArrayBuffer\n return await response.arrayBuffer();\n }\n}\n\n/**\n * Checks if a response indicates success (status 200-299)\n * @param response - Fetch Response object\n * @returns true if response is successful\n */\nexport function isSuccessResponse(response: Response): boolean {\n return response.ok;\n}\n","import { createFetchError, FetchError } from './errors';\nimport { HookRegistry } from './hooks';\nimport { calculateRetryDelay } from './retry';\nimport {\n parseSSEStream,\n parseNDJSONStream,\n parseChunkedStream,\n} from './streaming';\nimport type {\n FetchClientConfig,\n RequestOptions,\n StreamingRequestOptions,\n AuthStrategy,\n} from './types';\nimport {\n buildUrl,\n serializeBody,\n getContentType,\n parseResponse,\n isSuccessResponse,\n} from './utils';\nimport {\n isFetchAvailable,\n getFetchErrorMessage,\n encodeBase64,\n} from './utils/environment';\n\n/**\n * Universal HTTP fetch client with hooks, retries, and streaming support\n */\nexport class FetchClient {\n private hookRegistry: HookRegistry;\n private cfg: FetchClientConfig;\n\n constructor(config: FetchClientConfig = {}) {\n this.cfg = config;\n\n // Set default base URL if not provided\n if (!this.cfg.baseURL) {\n this.cfg.baseURL = '';\n }\n\n // Initialize hook registry\n this.hookRegistry = new HookRegistry(this.cfg.hooks);\n\n // Check fetch availability\n if (!isFetchAvailable() && !this.cfg.fetch) {\n throw new Error(getFetchErrorMessage());\n }\n }\n\n /**\n * Add an authentication strategy\n */\n addAuthStrategy(strategy: AuthStrategy): void {\n if (!this.cfg.auth) {\n this.cfg.auth = { strategies: [] };\n }\n this.cfg.auth.strategies.push(strategy);\n }\n\n /**\n * Remove all authentication strategies\n */\n clearAuthStrategies(): void {\n if (this.cfg.auth) {\n this.cfg.auth.strategies = [];\n }\n }\n\n /**\n * Register a hook for a specific lifecycle stage\n */\n useHook(stage: string, hook: any): void {\n this.hookRegistry.register(stage as any, hook);\n }\n\n /**\n * Remove a hook\n */\n removeHook(stage: string, hook: any): boolean {\n return this.hookRegistry.remove(stage as any, hook);\n }\n\n /**\n * Clear hooks for a stage or all hooks\n */\n clearHooks(stage?: string): void {\n this.hookRegistry.clear(stage as any);\n }\n\n /**\n * Make an HTTP request\n */\n async request<T = any>(init: RequestOptions): Promise<T> {\n let url = buildUrl(this.cfg.baseURL || '', init.path, init.query);\n // Create headers, handling both plain objects and Headers instances\n const headers = new Headers(this.cfg.headers || {});\n if (init.headers) {\n if (init.headers instanceof Headers) {\n // Copy from Headers object\n init.headers.forEach((value, key) => {\n headers.set(key, value);\n });\n } else {\n // Merge from plain object\n Object.entries(init.headers).forEach(([key, value]) => {\n headers.set(key, String(value));\n });\n }\n }\n\n // Apply authentication (may modify URL for query-based auth)\n await this.applyAuthentication(headers, url);\n\n // Set content type if body is provided (check before serialization)\n let bodyContentType: string | undefined;\n if (init.body !== undefined) {\n // Check if Content-Type is already set in headers\n bodyContentType = headers.get('Content-Type') || undefined;\n if (!bodyContentType) {\n bodyContentType = getContentType(init.body);\n if (bodyContentType) {\n headers.set('Content-Type', bodyContentType);\n }\n }\n }\n\n const retries = this.cfg.retry?.retries ?? 0;\n const baseBackoff = this.cfg.retry?.backoffMs ?? 300;\n const retryOn = this.cfg.retry?.retryOn ?? [429, 500, 502, 503, 504];\n const retryStrategy = this.cfg.retry?.strategy ?? 'exponential';\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= retries + 1; attempt++) {\n try {\n // Rebuild URL for each attempt (in case query params were modified by auth)\n let attemptUrl = buildUrl(\n this.cfg.baseURL || '',\n init.path,\n init.query\n );\n // Clone headers for each attempt\n const attemptHeaders = new Headers(headers);\n // Re-apply authentication for each attempt\n await this.applyAuthentication(attemptHeaders, attemptUrl);\n return await this.doRequest<T>(\n attemptUrl,\n init,\n attemptHeaders,\n attempt,\n bodyContentType\n );\n } catch (err: any) {\n lastError = err;\n\n // Check if we should retry\n const shouldRetry = this.shouldRetry(err, attempt, retries, retryOn);\n\n if (shouldRetry) {\n // Execute beforeRetry hook\n if (this.hookRegistry.has('beforeRetry')) {\n await this.hookRegistry.execute('beforeRetry', {\n url: url.toString(),\n init: { ...init, headers },\n attempt,\n error: err,\n retryCount: attempt,\n });\n }\n\n // Calculate delay\n const delay = calculateRetryDelay(\n attempt,\n retryStrategy,\n baseBackoff\n );\n await new Promise((resolve) => setTimeout(resolve, delay));\n\n // Execute afterRetry hook\n if (this.hookRegistry.has('afterRetry')) {\n await this.hookRegistry.execute('afterRetry', {\n url: url.toString(),\n init: { ...init, headers },\n attempt,\n error: err,\n retryCount: attempt,\n success: false, // Will be updated if retry succeeds\n });\n }\n\n continue;\n }\n\n // Not retrying - throw the error\n throw err;\n }\n }\n\n throw lastError as any;\n }\n\n /**\n * Make a streaming HTTP request\n */\n async *requestStream<T = any>(\n init: StreamingRequestOptions\n ): AsyncGenerator<T, void, unknown> {\n let url = buildUrl(this.cfg.baseURL || '', init.path, init.query);\n // Create headers, handling both plain objects and Headers instances\n const headers = new Headers(this.cfg.headers || {});\n if (init.headers) {\n if (init.headers instanceof Headers) {\n // Copy from Headers object\n init.headers.forEach((value, key) => {\n headers.set(key, value);\n });\n } else {\n // Merge from plain object\n Object.entries(init.headers).forEach(([key, value]) => {\n headers.set(key, String(value));\n });\n }\n }\n\n // Apply authentication (may modify URL for query-based auth)\n await this.applyAuthentication(headers, url);\n\n // Determine content type for body serialization\n let bodyContentType: string | undefined =\n headers.get('Content-Type') || undefined;\n if (init.contentType && !bodyContentType) {\n bodyContentType = init.contentType;\n headers.set('Content-Type', bodyContentType);\n }\n\n const fetchInit: RequestInit & {\n path: string;\n method: string;\n query?: Record<string, any>;\n headers: Headers;\n } = {\n ...init,\n headers,\n body: serializeBody(init.body, bodyContentType),\n };\n\n // Set credentials from config if provided\n if (this.cfg.credentials !== undefined) {\n fetchInit.credentials = this.cfg.credentials;\n }\n\n // Execute beforeRequest hook\n if (this.hookRegistry.has('beforeRequest')) {\n await this.hookRegistry.execute('beforeRequest', {\n url: url.toString(),\n init: fetchInit,\n attempt: 0,\n });\n }\n\n let controller: AbortController | undefined;\n let timeoutId: any;\n const existingSignal = fetchInit.signal;\n\n // Setup timeout\n if (this.cfg.timeoutMs && typeof AbortController !== 'undefined') {\n controller = new AbortController();\n if (existingSignal) {\n if (existingSignal.aborted) {\n controller.abort();\n } else {\n existingSignal.addEventListener('abort', () => {\n controller?.abort();\n });\n }\n }\n fetchInit.signal = controller.signal;\n timeoutId = setTimeout(() => {\n controller?.abort();\n // Execute onTimeout hook\n if (this.hookRegistry.has('onTimeout')) {\n this.hookRegistry.execute('onTimeout', {\n url: url.toString(),\n init: fetchInit,\n attempt: 0,\n timeoutMs: this.cfg.timeoutMs!,\n });\n }\n }, this.cfg.timeoutMs);\n }\n\n try {\n const fetchFn = this.cfg.fetch || fetch;\n const res = await fetchFn(url.toString(), fetchInit);\n\n // Execute afterRequest hook\n if (this.hookRegistry.has('afterRequest')) {\n await this.hookRegistry.execute('afterRequest', {\n url: url.toString(),\n init: fetchInit,\n attempt: 0,\n response: res,\n });\n }\n\n if (!res.ok) {\n const parsed = await parseResponse(res);\n const error = createFetchError(\n res.status,\n parsed?.message || `HTTP ${res.status}`,\n parsed,\n res.headers\n );\n\n // Execute onError hook\n if (this.hookRegistry.has('onError')) {\n await this.hookRegistry.execute('onError', {\n url: url.toString(),\n init: fetchInit,\n attempt: 0,\n error,\n });\n }\n\n throw error;\n }\n\n // Execute onStreamStart hook\n if (this.hookRegistry.has('onStreamStart')) {\n await this.hookRegistry.execute('onStreamStart', {\n url: url.toString(),\n init: fetchInit,\n attempt: 0,\n response: res,\n });\n }\n\n // Route to appropriate parser based on streaming format\n const streamingFormat = init.streamingFormat || 'chunked';\n\n if (streamingFormat === 'sse') {\n for await (const chunk of parseSSEStream(res)) {\n let transformedChunk = chunk;\n // Execute onStreamChunk hook if present\n if (this.hookRegistry.has('onStreamChunk')) {\n await this.hookRegistry.execute('onStreamChunk', {\n url: url.toString(),\n init: fetchInit,\n attempt: 0,\n chunk,\n });\n }\n yield transformedChunk as T;\n }\n } else if (streamingFormat === 'ndjson') {\n for await (const chunk of parseNDJSONStream<T>(res)) {\n let transformedChunk = chunk;\n // Execute onStreamChunk hook if present\n if (this.hookRegistry.has('onStreamChunk')) {\n await this.hookRegistry.execute('onStreamChunk', {\n url: url.toString(),\n init: fetchInit,\n attempt: 0,\n chunk,\n });\n }\n yield transformedChunk as T;\n }\n } else {\n // Generic chunked streaming\n for await (const chunk of parseChunkedStream<T>(res)) {\n let transformedChunk = chunk;\n // Execute onStreamChunk hook if present\n if (this.hookRegistry.has('onStreamChunk')) {\n await this.hookRegistry.execute('onStreamChunk', {\n url: url.toString(),\n init: fetchInit,\n attempt: 0,\n chunk,\n });\n }\n yield transformedChunk as T;\n }\n }\n\n // Execute onStreamEnd hook\n if (this.hookRegistry.has('onStreamEnd')) {\n await this.hookRegistry.execute('onStreamEnd', {\n url: url.toString(),\n init: fetchInit,\n attempt: 0,\n response: res,\n });\n }\n } catch (err) {\n // Execute onError hook\n if (this.hookRegistry.has('onError')) {\n await this.hookRegistry.execute('onError', {\n url: url.toString(),\n init: fetchInit,\n attempt: 0,\n error: err,\n });\n }\n throw err;\n } finally {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n }\n\n /**\n * Internal method to execute a single request attempt\n */\n private async doRequest<T>(\n url: URL,\n init: RequestOptions,\n baseHeaders: Headers,\n attempt: number,\n contentType?: string\n ): Promise<T> {\n // Headers are already cloned and auth is already applied\n const requestHeaders = baseHeaders;\n\n const fetchInit: RequestInit & {\n path: string;\n method: string;\n query?: Record<string, any>;\n headers: Headers;\n } = {\n ...init,\n headers: requestHeaders,\n body: serializeBody(init.body, contentType),\n };\n\n // Set credentials from config if provided\n if (this.cfg.credentials !== undefined) {\n fetchInit.credentials = this.cfg.credentials;\n }\n\n // Execute beforeRequest hook\n if (this.hookRegistry.has('beforeRequest')) {\n await this.hookRegistry.execute('beforeRequest', {\n url: url.toString(),\n init: fetchInit,\n attempt,\n });\n }\n\n let controller: AbortController | undefined;\n let timeoutId: any;\n const existingSignal = fetchInit.signal;\n\n // Setup timeout\n if (this.cfg.timeoutMs && typeof AbortController !== 'undefined') {\n controller = new AbortController();\n if (existingSignal) {\n if (existingSignal.aborted) {\n controller.abort();\n } else {\n existingSignal.addEventListener('abort', () => {\n controller?.abort();\n });\n }\n }\n fetchInit.signal = controller.signal;\n timeoutId = setTimeout(() => {\n controller?.abort();\n // Execute onTimeout hook\n if (this.hookRegistry.has('onTimeout')) {\n this.hookRegistry.execute('onTimeout', {\n url: url.toString(),\n init: fetchInit,\n attempt,\n timeoutMs: this.cfg.timeoutMs!,\n });\n }\n }, this.cfg.timeoutMs);\n }\n\n try {\n const fetchFn = this.cfg.fetch || fetch;\n const res = await fetchFn(url.toString(), fetchInit);\n\n // Execute afterRequest hook\n if (this.hookRegistry.has('afterRequest')) {\n await this.hookRegistry.execute('afterRequest', {\n url: url.toString(),\n init: fetchInit,\n attempt,\n response: res,\n });\n }\n\n const parsed = await parseResponse(res);\n\n // Execute afterResponse hook\n if (this.hookRegistry.has('afterResponse')) {\n await this.hookRegistry.execute('afterResponse', {\n url: url.toString(),\n init: fetchInit,\n attempt,\n response: res,\n data: parsed,\n });\n }\n\n if (!isSuccessResponse(res)) {\n const error = createFetchError(\n res.status,\n parsed?.message || `HTTP ${res.status}`,\n parsed,\n res.headers\n );\n\n // Execute onError hook\n if (this.hookRegistry.has('onError')) {\n await this.hookRegistry.execute('onError', {\n url: url.toString(),\n init: fetchInit,\n attempt,\n error,\n });\n }\n\n throw error;\n }\n\n return parsed as T;\n } catch (err) {\n // Execute onError hook\n if (this.hookRegistry.has('onError')) {\n await this.hookRegistry.execute('onError', {\n url: url.toString(),\n init: fetchInit,\n attempt,\n error: err,\n });\n }\n\n // Re-throw with proper error type if needed\n if (err instanceof DOMException) {\n throw err;\n }\n if (err instanceof FetchError) {\n throw err;\n }\n\n // For network errors, try to extract status if available\n const status = (err as any)?.status as number | undefined;\n const statusCode = typeof status === 'number' ? status : 0;\n if (typeof err === 'string') {\n throw createFetchError(statusCode, err);\n }\n throw createFetchError(\n statusCode,\n (err as Error)?.message || 'Network error'\n );\n } finally {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n }\n\n /**\n * Apply authentication strategies\n */\n private async applyAuthentication(headers: Headers, url: URL): Promise<void> {\n if (!this.cfg.auth?.strategies) {\n return;\n }\n\n for (const strategy of this.cfg.auth.strategies) {\n await this.applyAuthStrategy(strategy, headers, url);\n }\n }\n\n /**\n * Apply a single authentication strategy\n */\n private async applyAuthStrategy(\n strategy: AuthStrategy,\n headers: Headers,\n url: URL\n ): Promise<void> {\n switch (strategy.type) {\n case 'bearer': {\n const token =\n typeof strategy.token === 'function'\n ? await strategy.token()\n : strategy.token;\n if (token != null) {\n const headerName = strategy.headerName || 'Authorization';\n headers.set(headerName, `Bearer ${String(token)}`);\n }\n break;\n }\n\n case 'basic': {\n const encoded = encodeBase64(\n `${strategy.username}:${strategy.password}`\n );\n headers.set('Authorization', `Basic ${encoded}`);\n break;\n }\n\n case 'apiKey': {\n const key =\n typeof strategy.key === 'function'\n ? await strategy.key()\n : strategy.key;\n if (key != null) {\n switch (strategy.location) {\n case 'header':\n headers.set(strategy.name, String(key));\n break;\n case 'query':\n url.searchParams.set(strategy.name, String(key));\n break;\n case 'cookie':\n headers.set('Cookie', `${strategy.name}=${String(key)}`);\n break;\n }\n }\n break;\n }\n\n case 'custom':\n await strategy.apply(headers, url);\n break;\n }\n }\n\n /**\n * Determine if an error should be retried\n */\n private shouldRetry(\n error: unknown,\n attempt: number,\n maxRetries: number,\n retryOn: number[]\n ): boolean {\n if (attempt >= maxRetries) {\n return false;\n }\n\n // Check custom retry condition\n if (this.cfg.retry?.retryOnError) {\n return this.cfg.retry.retryOnError(error);\n }\n\n // Check if it's a FetchError with a retryable status code\n if (error instanceof FetchError) {\n return retryOn.includes(error.status);\n }\n\n // Network errors (no status code) should be retried\n return true;\n }\n}\n"],"mappings":"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","names":["FetchError","Error","message","status","data","headers","name","captureStackTrace","ClientError","ServerError","BadRequestError","UnauthorizedError","ForbiddenError","NotFoundError","MethodNotAllowedError","ConflictError","UnprocessableEntityError","TooManyRequestsError","InternalServerError","BadGatewayError","ServiceUnavailableError","GatewayTimeoutError","createFetchError","defaultMessage","HookRegistry","hooks","Map","config","registerFromConfig","stage","Object","entries","Array","isArray","hook","register","has","set","get","push","remove","index","indexOf","splice","clear","delete","execute","context","length","exponentialStrategy","attempt","baseBackoffMs","Math","pow","linearStrategy","getRetryStrategy","strategy","calculateRetryDelay","strategyFn","parseSSEStream","response","body","reader","getReader","decoder","TextDecoder","buffer","done","value","read","decode","stream","lines","split","pop","currentEvent","line","trim","undefined","colonIndex","field","substring","type","id","releaseLock","parseNDJSONStream","trimmed","parsed","JSON","parse","error","console","warn","parseChunkedStream","chunk","isBrowser","globalThis","window","document","isNode","process","versions","node","encodeBase64","str","btoa","Buffer","from","toString","isFetchAvailable","fetch","isAbortControllerAvailable","AbortController","getFetchErrorMessage","serializeQueryParams","query","params","URLSearchParams","key","item","append","String","buildUrl","baseUrl","path","normalizedPath","endsWith","slice","normalizedBaseUrl","baseUrlObj","URL","pathname","startsWith","url","keys","Set","searchParams","getAll","getContentType","FormData","serializeBody","contentType","Blob","ArrayBuffer","isView","stringify","parseResponse","includes","json","text","arrayBuffer","isSuccessResponse","ok","FetchClient","hookRegistry","cfg","baseURL","addAuthStrategy","auth","strategies","clearAuthStrategies","useHook","removeHook","clearHooks","request","init","Headers","forEach","applyAuthentication","bodyContentType","retries","retry","baseBackoff","backoffMs","retryOn","retryStrategy","lastError","attemptUrl","attemptHeaders","doRequest","err","shouldRetry","retryCount","delay","Promise","resolve","setTimeout","success","requestStream","fetchInit","credentials","controller","timeoutId","existingSignal","signal","timeoutMs","aborted","abort","addEventListener","fetchFn","res","streamingFormat","transformedChunk","clearTimeout","baseHeaders","requestHeaders","DOMException","statusCode","applyAuthStrategy","token","headerName","encoded","username","password","location","apply","maxRetries","retryOnError"]}
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
var __defProp = Object.defineProperty;
|
|
2
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
@@ -1342,6 +1343,8 @@ var AuthRefreshQuerySchema = import_zod.z.object({
|
|
|
1342
1343
|
|
|
1343
1344
|
// src/index.ts
|
|
1344
1345
|
var Blimu = class {
|
|
1346
|
+
auth;
|
|
1347
|
+
entitlements;
|
|
1345
1348
|
constructor(options) {
|
|
1346
1349
|
const core = new CoreClient(options);
|
|
1347
1350
|
this.auth = new AuthService(core);
|