@igniter-js/caller 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/builder/igniter-caller.builder.ts","../src/errors/igniter-caller.error.ts","../src/utils/body.ts","../src/utils/cache.ts","../src/utils/schema.ts","../src/utils/url.ts","../src/builder/igniter-caller-request.builder.ts","../src/core/igniter-caller-events.ts","../src/core/igniter-caller.ts","../src/utils/testing.ts"],"names":["IgniterError","match","responseSchema","response","callbacks"],"mappings":"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","file":"index.js","sourcesContent":["import type { IgniterLogger } from '@igniter-js/core'\nimport type {\n IgniterCallerRequestInterceptor,\n IgniterCallerResponseInterceptor,\n} from '../types/interceptors'\nimport type {\n IgniterCallerSchemaMap,\n IgniterCallerSchemaValidationOptions,\n} from '../types/schemas'\nimport type {\n IgniterCallerStoreAdapter,\n IgniterCallerStoreOptions,\n} from '../types/store'\n\nexport type IgniterCallerBuilderState<\n TSchemas extends IgniterCallerSchemaMap = any,\n> = {\n baseURL?: string\n headers?: Record<string, string>\n cookies?: Record<string, string>\n logger?: IgniterLogger\n requestInterceptors?: IgniterCallerRequestInterceptor[]\n responseInterceptors?: IgniterCallerResponseInterceptor[]\n store?: IgniterCallerStoreAdapter\n storeOptions?: IgniterCallerStoreOptions\n schemas?: TSchemas\n schemaValidation?: IgniterCallerSchemaValidationOptions\n}\n\nexport type IgniterCallerBuilderFactory<\n TCaller,\n TSchemas extends IgniterCallerSchemaMap = any,\n> = (state: IgniterCallerBuilderState<TSchemas>) => TCaller\n\n/**\n * Builder used by developers to initialize the `IgniterCaller` client.\n *\n * This API is designed to remain stable when extracted to `@igniter-js/caller`.\n */\nexport class IgniterCallerBuilder<\n TCaller = unknown,\n TSchemas extends IgniterCallerSchemaMap = any,\n> {\n private readonly state: IgniterCallerBuilderState<TSchemas>\n private readonly factory: IgniterCallerBuilderFactory<TCaller, TSchemas>\n\n private constructor(\n state: IgniterCallerBuilderState<TSchemas>,\n factory: IgniterCallerBuilderFactory<TCaller, TSchemas>,\n ) {\n this.state = state\n this.factory = factory\n }\n\n /**\n * Creates a new builder instance.\n */\n static create<TCaller, TSchemas extends IgniterCallerSchemaMap = any>(\n factory: IgniterCallerBuilderFactory<TCaller, TSchemas>,\n ): IgniterCallerBuilder<TCaller, TSchemas> {\n return new IgniterCallerBuilder({}, factory)\n }\n\n /** Sets the base URL for all requests. */\n withBaseUrl(baseURL: string): IgniterCallerBuilder<TCaller, TSchemas> {\n return new IgniterCallerBuilder({ ...this.state, baseURL }, this.factory)\n }\n\n /** Merges default headers for all requests. */\n withHeaders(headers: Record<string, string>): IgniterCallerBuilder<TCaller> {\n return new IgniterCallerBuilder({ ...this.state, headers }, this.factory)\n }\n\n /** Sets default cookies (sent as the `Cookie` header). */\n withCookies(cookies: Record<string, string>): IgniterCallerBuilder<TCaller> {\n return new IgniterCallerBuilder({ ...this.state, cookies }, this.factory)\n }\n\n /** Attaches a logger instance. */\n withLogger(logger: IgniterLogger): IgniterCallerBuilder<TCaller, TSchemas> {\n return new IgniterCallerBuilder({ ...this.state, logger }, this.factory)\n }\n\n /** Adds a request interceptor that runs before each request. */\n withRequestInterceptor(\n interceptor: IgniterCallerRequestInterceptor,\n ): IgniterCallerBuilder<TCaller, TSchemas> {\n const requestInterceptors = [\n ...(this.state.requestInterceptors || []),\n interceptor,\n ]\n return new IgniterCallerBuilder(\n { ...this.state, requestInterceptors },\n this.factory,\n )\n }\n\n /** Adds a response interceptor that runs after each request. */\n withResponseInterceptor(\n interceptor: IgniterCallerResponseInterceptor,\n ): IgniterCallerBuilder<TCaller, TSchemas> {\n const responseInterceptors = [\n ...(this.state.responseInterceptors || []),\n interceptor,\n ]\n return new IgniterCallerBuilder(\n { ...this.state, responseInterceptors },\n this.factory,\n )\n }\n\n /**\n * Configures a persistent store adapter for caching.\n *\n * When configured, cache operations will use the store (e.g., Redis)\n * instead of in-memory cache, enabling persistent cache across deployments.\n */\n withStore(\n store: IgniterCallerStoreAdapter,\n options?: IgniterCallerStoreOptions,\n ): IgniterCallerBuilder<TCaller, TSchemas> {\n return new IgniterCallerBuilder(\n { ...this.state, store, storeOptions: options },\n this.factory,\n )\n }\n\n /**\n * Configures schema-based type safety and validation.\n *\n * Enables automatic type inference for requests/responses based on\n * route and method, with optional runtime validation via Zod.\n *\n * @example\n * ```ts\n * const api = IgniterCaller.create()\n * .withSchemas({\n * '/users': {\n * GET: {\n * responses: {\n * 200: z.array(UserSchema),\n * 401: ErrorSchema,\n * },\n * },\n * POST: {\n * request: CreateUserSchema,\n * responses: {\n * 201: UserSchema,\n * 400: ValidationErrorSchema,\n * },\n * },\n * },\n * })\n * .build()\n * ```\n */\n withSchemas<TNewSchemas extends IgniterCallerSchemaMap>(\n schemas: TNewSchemas,\n validation?: IgniterCallerSchemaValidationOptions,\n ): IgniterCallerBuilder<TCaller, TNewSchemas> {\n return new IgniterCallerBuilder(\n { ...this.state, schemas, schemaValidation: validation },\n this.factory as any,\n )\n }\n\n /**\n * Builds the `IgniterCaller` instance.\n */\n build(): TCaller {\n return this.factory(this.state)\n }\n}\n","import { IgniterError, type IgniterLogger } from '@igniter-js/core'\n\nexport type IgniterCallerErrorCode =\n | 'IGNITER_CALLER_HTTP_ERROR'\n | 'IGNITER_CALLER_TIMEOUT'\n | 'IGNITER_CALLER_REQUEST_VALIDATION_FAILED'\n | 'IGNITER_CALLER_RESPONSE_VALIDATION_FAILED'\n | 'IGNITER_CALLER_UNKNOWN_ERROR'\n\nexport type IgniterCallerOperation =\n | 'execute'\n | 'download'\n | 'buildRequest'\n | 'parseResponse'\n | 'validateRequest'\n | 'validateResponse'\n\n/**\n * Payload used to create an {@link IgniterCallerError}.\n */\nexport type IgniterCallerErrorPayload = {\n /** Machine-readable error code. */\n code: IgniterCallerErrorCode\n /** Where the error happened. */\n operation: IgniterCallerOperation\n /** Human-readable message. */\n message: string\n /** Optional HTTP status code when surfacing errors through HTTP boundaries. */\n statusCode?: number\n /** Optional HTTP status text (when available). */\n statusText?: string\n /** Extra diagnostic details (e.g. response body or schema issues). */\n details?: unknown\n /** Arbitrary metadata for debugging. */\n metadata?: Record<string, unknown>\n /** Optional original cause. */\n cause?: unknown\n /** Optional logger used by IgniterError. */\n logger?: IgniterLogger\n}\n\n/**\n * Typed error for predictable failures in `IgniterCaller`.\n *\n * Designed to be extracted into `@igniter-js/caller`.\n */\nexport class IgniterCallerError extends IgniterError {\n declare readonly code: IgniterCallerErrorCode\n readonly operation: IgniterCallerOperation\n readonly statusText?: string\n readonly cause?: unknown\n\n constructor(payload: IgniterCallerErrorPayload) {\n const metadata = {\n ...payload.metadata,\n operation: payload.operation,\n statusText: payload.statusText,\n }\n\n const details =\n payload.details ??\n (payload.cause !== undefined ? { cause: payload.cause } : undefined)\n\n super({\n code: payload.code,\n message: payload.message,\n statusCode: payload.statusCode,\n causer: '@igniter-js/caller',\n details,\n metadata,\n logger: payload.logger,\n })\n\n this.name = 'IgniterCallerError'\n this.operation = payload.operation\n this.statusText = payload.statusText\n this.cause = payload.cause\n }\n\n static is(error: unknown): error is IgniterCallerError {\n return error instanceof IgniterCallerError\n }\n}\n\n","export class IgniterCallerBodyUtils {\n /**\n * Returns true when the request body should be passed to `fetch` as-is.\n */\n static isRawBody(body: unknown): boolean {\n if (!body) return false\n\n if (typeof FormData !== 'undefined' && body instanceof FormData) return true\n if (typeof Blob !== 'undefined' && body instanceof Blob) return true\n if (typeof ArrayBuffer !== 'undefined' && body instanceof ArrayBuffer)\n return true\n if (\n typeof URLSearchParams !== 'undefined' &&\n body instanceof URLSearchParams\n )\n return true\n if (typeof ReadableStream !== 'undefined' && body instanceof ReadableStream)\n return true\n\n // Node Buffer\n if (typeof Buffer !== 'undefined' && Buffer.isBuffer(body)) return true\n\n // DataView, Int8Array, etc.\n if (typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView(body as any))\n return true\n\n return false\n }\n\n /**\n * Removes Content-Type for FormData so fetch can set boundaries automatically.\n */\n static normalizeHeadersForBody(\n headers: Record<string, string> | undefined,\n body: unknown,\n ): Record<string, string> | undefined {\n if (!headers) return headers\n\n const isFormData = typeof FormData !== 'undefined' && body instanceof FormData\n if (!isFormData) return headers\n\n if (!('Content-Type' in headers)) return headers\n\n const { 'Content-Type': _contentType, ...rest } = headers\n return rest\n }\n}\n","import type {\n IgniterCallerStoreAdapter,\n IgniterCallerStoreOptions,\n} from '../types/store'\n\n/**\n * Cache interface for HTTP responses.\n *\n * Supports both in-memory caching and persistent store-based caching (Redis, etc).\n */\nexport class IgniterCallerCacheUtils {\n private static cache = new Map<\n string,\n { data: unknown; timestamp: number }\n >()\n private static store: IgniterCallerStoreAdapter | null = null\n private static storeOptions: IgniterCallerStoreOptions = {\n ttl: 3600,\n keyPrefix: 'igniter:caller:',\n fallbackToFetch: true,\n }\n\n /**\n * Configures a persistent store adapter for caching.\n *\n * When configured, cache operations will use the store (e.g., Redis)\n * instead of in-memory cache, enabling persistent cache across deployments.\n */\n static setStore(\n store: IgniterCallerStoreAdapter,\n options?: IgniterCallerStoreOptions,\n ): void {\n IgniterCallerCacheUtils.store = store\n if (options) {\n IgniterCallerCacheUtils.storeOptions = {\n ...IgniterCallerCacheUtils.storeOptions,\n ...options,\n }\n }\n }\n\n /**\n * Gets the configured store adapter.\n */\n static getStore(): IgniterCallerStoreAdapter | null {\n return IgniterCallerCacheUtils.store\n }\n\n /**\n * Gets cached data if it exists and is not stale.\n */\n static async get<T>(key: string, staleTime?: number): Promise<T | undefined> {\n const prefixedKey = IgniterCallerCacheUtils.getPrefixedKey(key)\n\n // Try store first if available\n if (IgniterCallerCacheUtils.store) {\n try {\n const data = await IgniterCallerCacheUtils.store.get<T>(prefixedKey)\n if (data !== null) {\n return data\n }\n } catch (error) {\n console.error('IgniterCaller: Store get failed', error)\n // Fall through to in-memory cache\n }\n }\n\n // Fallback to in-memory cache\n const entry = IgniterCallerCacheUtils.cache.get(prefixedKey)\n if (!entry) return undefined\n\n if (staleTime && Date.now() - entry.timestamp > staleTime) {\n IgniterCallerCacheUtils.cache.delete(prefixedKey)\n return undefined\n }\n\n return entry.data as T\n }\n\n /**\n * Stores data in cache with current timestamp.\n */\n static async set(key: string, data: unknown, ttl?: number): Promise<void> {\n const prefixedKey = IgniterCallerCacheUtils.getPrefixedKey(key)\n const effectiveTtl = ttl || IgniterCallerCacheUtils.storeOptions.ttl || 3600\n\n // Try store first if available\n if (IgniterCallerCacheUtils.store) {\n try {\n await IgniterCallerCacheUtils.store.set(prefixedKey, data, {\n ttl: effectiveTtl,\n })\n return\n } catch (error) {\n console.error('IgniterCaller: Store set failed', error)\n // Fall through to in-memory cache\n }\n }\n\n // Fallback to in-memory cache\n IgniterCallerCacheUtils.cache.set(prefixedKey, {\n data,\n timestamp: Date.now(),\n })\n }\n\n /**\n * Clears a specific cache entry.\n */\n static async clear(key: string): Promise<void> {\n const prefixedKey = IgniterCallerCacheUtils.getPrefixedKey(key)\n\n // Try store first\n if (IgniterCallerCacheUtils.store) {\n try {\n await IgniterCallerCacheUtils.store.delete(prefixedKey)\n } catch (error) {\n console.error('IgniterCaller: Store delete failed', error)\n }\n }\n\n // Also clear from in-memory cache\n IgniterCallerCacheUtils.cache.delete(prefixedKey)\n }\n\n /**\n * Clears all cache entries matching a pattern.\n *\n * @param pattern Glob pattern (e.g., '/users/*') or exact key\n */\n static async clearPattern(pattern: string): Promise<void> {\n const prefixedPattern = IgniterCallerCacheUtils.getPrefixedKey(pattern)\n const regex = IgniterCallerCacheUtils.globToRegex(prefixedPattern)\n\n // Clear from in-memory cache\n for (const key of IgniterCallerCacheUtils.cache.keys()) {\n if (regex.test(key)) {\n IgniterCallerCacheUtils.cache.delete(key)\n }\n }\n\n // Note: Store pattern deletion depends on store implementation\n // Redis supports SCAN + DEL, but we keep it simple here\n if (IgniterCallerCacheUtils.store) {\n console.warn(\n 'IgniterCaller: Pattern-based cache invalidation in store requires manual implementation',\n )\n }\n }\n\n /**\n * Clears all cache entries.\n */\n static async clearAll(): Promise<void> {\n IgniterCallerCacheUtils.cache.clear()\n\n if (IgniterCallerCacheUtils.store) {\n console.warn(\n 'IgniterCaller: clearAll() only clears in-memory cache. Store cache requires manual cleanup.',\n )\n }\n }\n\n /**\n * Adds the configured prefix to a key.\n */\n private static getPrefixedKey(key: string): string {\n const prefix = IgniterCallerCacheUtils.storeOptions.keyPrefix || ''\n return `${prefix}${key}`\n }\n\n /**\n * Converts a glob pattern to a RegExp.\n */\n private static globToRegex(pattern: string): RegExp {\n const escaped = pattern\n .replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*/g, '.*')\n return new RegExp(`^${escaped}$`)\n }\n}\n","import type { IgniterLogger, StandardSchemaV1 } from '@igniter-js/core'\nimport { IgniterCallerError } from '../errors/igniter-caller.error'\nimport type {\n IgniterCallerEndpointSchema,\n IgniterCallerSchemaMap,\n IgniterCallerSchemaMethod,\n IgniterCallerSchemaValidationOptions,\n} from '../types/schemas'\n\n/**\n * Utilities for schema matching and validation.\n *\n * @internal\n */\nexport class IgniterCallerSchemaUtils {\n /**\n * Matches a URL path against schema map paths (supports path parameters).\n *\n * @example\n * ```ts\n * matchPath('/users/123', '/users/:id') // { matched: true, params: { id: '123' } }\n * matchPath('/users', '/users/:id') // { matched: false }\n * ```\n */\n static matchPath(\n actualPath: string,\n schemaPath: string,\n ): { matched: boolean; params?: Record<string, string> } {\n // Exact match (no params)\n if (actualPath === schemaPath) {\n return { matched: true, params: {} }\n }\n\n // Build regex from schema path pattern\n const paramNames: string[] = []\n const regexPattern = schemaPath\n .replace(/:[^/]+/g, (match) => {\n paramNames.push(match.slice(1)) // Remove ':'\n return '([^/]+)'\n })\n .replace(/\\//g, '\\\\/')\n\n const regex = new RegExp(`^${regexPattern}$`)\n const match = actualPath.match(regex)\n\n if (!match) {\n return { matched: false }\n }\n\n // Extract params\n const params: Record<string, string> = {}\n for (let i = 0; i < paramNames.length; i++) {\n params[paramNames[i]] = match[i + 1]\n }\n\n return { matched: true, params }\n }\n\n /**\n * Finds the schema for a given path and method from the schema map.\n */\n static findSchema(\n schemaMap: IgniterCallerSchemaMap | undefined,\n path: string,\n method: string,\n ): {\n schema: IgniterCallerEndpointSchema | undefined\n params: Record<string, string>\n } {\n if (!schemaMap) {\n return { schema: undefined, params: {} }\n }\n\n // Try exact match first\n const exactMatch = schemaMap[path]?.[method as IgniterCallerSchemaMethod]\n if (exactMatch) {\n return { schema: exactMatch, params: {} }\n }\n\n // Try pattern matching with path params\n for (const [schemaPath, methods] of Object.entries(schemaMap)) {\n const matchResult = IgniterCallerSchemaUtils.matchPath(path, schemaPath)\n if (matchResult.matched) {\n const schema = methods?.[method as IgniterCallerSchemaMethod]\n if (schema) {\n return { schema, params: matchResult.params || {} }\n }\n }\n }\n\n return { schema: undefined, params: {} }\n }\n\n /**\n * Validates input using StandardSchemaV1.\n *\n * If the schema provides `~standard.validate`, it will be used.\n * Otherwise, returns the input as-is.\n */\n private static async validateWithStandardSchema<\n TSchema extends StandardSchemaV1,\n >(\n schema: TSchema,\n input: unknown,\n ): Promise<StandardSchemaV1.InferInput<TSchema>> {\n const standard = (schema as any)?.['~standard'] as\n | {\n validate: (\n value: unknown,\n ) =>\n | { value?: unknown; issues?: unknown[] }\n | Promise<{ value?: unknown; issues?: unknown[] }>\n }\n | undefined\n\n if (!standard?.validate) {\n return input as StandardSchemaV1.InferInput<TSchema>\n }\n\n const result = await standard.validate(input)\n\n if ((result as any)?.issues?.length) {\n throw {\n issues: (result as any).issues,\n _standardSchemaValidationError: true,\n }\n }\n\n return ((result as any)?.value ??\n input) as StandardSchemaV1.InferInput<TSchema>\n }\n\n /**\n * Validates request body against schema.\n *\n * @returns Validated data or throws/logs error based on validation mode\n */\n static async validateRequest<T>(\n data: unknown,\n schema: StandardSchemaV1 | undefined,\n options: IgniterCallerSchemaValidationOptions | undefined,\n context: { url: string; method: string },\n logger?: IgniterLogger,\n ): Promise<T> {\n if (!schema || options?.mode === 'off') {\n return data as T\n }\n\n try {\n const validated =\n await IgniterCallerSchemaUtils.validateWithStandardSchema(schema, data)\n return validated as T\n } catch (error: any) {\n // Handle validation error\n if (options?.onValidationError && error?._standardSchemaValidationError) {\n options.onValidationError(error, { ...context, statusCode: 0 })\n }\n\n if (options?.mode === 'soft') {\n logger?.warn('Request validation failed (soft mode)', {\n url: context.url,\n method: context.method,\n errors: error?.issues,\n })\n return data as T\n }\n\n // Strict mode: throw\n throw new IgniterCallerError({\n code: 'IGNITER_CALLER_REQUEST_VALIDATION_FAILED',\n message: `Request validation failed for ${context.method} ${context.url}`,\n statusCode: 400,\n details: error?.issues,\n operation: 'validateRequest',\n })\n }\n }\n\n /**\n * Validates response data against schema.\n *\n * @returns Validated data or throws/logs error based on validation mode\n */\n static async validateResponse<T>(\n data: unknown,\n schema: StandardSchemaV1 | undefined,\n statusCode: number,\n options: IgniterCallerSchemaValidationOptions | undefined,\n context: { url: string; method: string },\n logger?: IgniterLogger,\n ): Promise<T> {\n if (!schema || options?.mode === 'off') {\n return data as T\n }\n\n try {\n const validated =\n await IgniterCallerSchemaUtils.validateWithStandardSchema(schema, data)\n return validated as T\n } catch (error: any) {\n // Handle validation error\n if (options?.onValidationError && error?._standardSchemaValidationError) {\n options.onValidationError(error, { ...context, statusCode })\n }\n\n if (options?.mode === 'soft') {\n logger?.warn('Response validation failed (soft mode)', {\n url: context.url,\n method: context.method,\n statusCode,\n errors: error?.issues,\n })\n return data as T\n }\n\n // Strict mode: throw\n throw new IgniterCallerError({\n code: 'IGNITER_CALLER_RESPONSE_VALIDATION_FAILED',\n message: `Response validation failed for ${context.method} ${context.url} (${statusCode})`,\n statusCode,\n details: error?.issues,\n operation: 'validateResponse',\n })\n }\n }\n}\n","export class IgniterCallerUrlUtils {\n static buildUrl(params: {\n url: string\n baseURL?: string\n query?: Record<string, string | number | boolean>\n }): string {\n const { url, baseURL, query } = params\n\n // If url is absolute, disregard baseURL\n let fullUrl = url\n if (baseURL && !/^https?:\\/\\//i.test(url)) {\n fullUrl = baseURL + url\n }\n\n if (query && Object.keys(query).length > 0) {\n const queryParams = new URLSearchParams(\n Object.entries(query).map(([key, value]) => [key, String(value)]),\n ).toString()\n\n fullUrl += (fullUrl.includes('?') ? '&' : '?') + queryParams\n }\n\n return fullUrl\n }\n}\n","import type { IgniterLogger } from '@igniter-js/core'\nimport type { z } from 'zod'\nimport { IgniterCallerError } from '../errors/igniter-caller.error'\nimport type { IgniterCallerHttpMethod } from '../types/http'\nimport type {\n IgniterCallerRequestInterceptor,\n IgniterCallerResponseInterceptor,\n} from '../types/interceptors'\nimport type { IgniterCallerRequestOptions } from '../types/request'\nimport type {\n IgniterCallerApiResponse,\n IgniterCallerFileResponse,\n} from '../types/response'\nimport type { IgniterCallerRetryOptions } from '../types/retry'\nimport type {\n IgniterCallerSchemaMap,\n IgniterCallerSchemaValidationOptions,\n} from '../types/schemas'\nimport { IgniterCallerBodyUtils } from '../utils/body'\nimport { IgniterCallerCacheUtils } from '../utils/cache'\nimport { IgniterCallerSchemaUtils } from '../utils/schema'\nimport { IgniterCallerUrlUtils } from '../utils/url'\n\n/**\n * Fluent request builder for `IgniterCaller`.\n */\nexport class IgniterCallerRequestBuilder {\n private options: IgniterCallerRequestOptions = {\n method: 'GET',\n url: '',\n headers: {\n 'Content-Type': 'application/json',\n },\n timeout: 30000,\n cache: 'default',\n }\n\n private logger?: IgniterLogger\n private retryOptions?: IgniterCallerRetryOptions\n private fallbackFn?: () => any\n private cacheKey?: string\n private staleTime?: number\n private requestInterceptors?: IgniterCallerRequestInterceptor[]\n private responseInterceptors?: IgniterCallerResponseInterceptor[]\n private eventEmitter?: (\n url: string,\n method: string,\n result: any,\n ) => Promise<void>\n private schemas?: IgniterCallerSchemaMap\n private schemaValidation?: IgniterCallerSchemaValidationOptions\n\n constructor(params: {\n baseURL?: string\n defaultHeaders?: Record<string, string>\n defaultCookies?: Record<string, string>\n logger?: IgniterLogger\n requestInterceptors?: IgniterCallerRequestInterceptor[]\n responseInterceptors?: IgniterCallerResponseInterceptor[]\n eventEmitter?: (url: string, method: string, result: any) => Promise<void>\n schemas?: IgniterCallerSchemaMap\n schemaValidation?: IgniterCallerSchemaValidationOptions\n }) {\n if (params.baseURL) this.options.baseURL = params.baseURL\n\n if (params.defaultHeaders) {\n this.options.headers = {\n ...this.options.headers,\n ...params.defaultHeaders,\n }\n }\n\n if (params.defaultCookies) {\n const cookieStr = Object.entries(params.defaultCookies)\n .map(([k, v]) => `${k}=${v}`)\n .join('; ')\n this.options.headers = { ...this.options.headers, Cookie: cookieStr }\n }\n\n this.logger = params.logger\n this.requestInterceptors = params.requestInterceptors\n this.responseInterceptors = params.responseInterceptors\n this.eventEmitter = params.eventEmitter\n this.schemas = params.schemas\n this.schemaValidation = params.schemaValidation\n }\n\n /**\n * Overrides the logger for this request chain.\n */\n withLogger(logger: IgniterLogger): this {\n this.logger = logger\n return this\n }\n\n method(method: IgniterCallerHttpMethod): this {\n this.options.method = method\n return this\n }\n\n url(url: string): this {\n this.options.url = url\n return this\n }\n\n body<TBody>(body: TBody): this {\n this.options.body = body\n return this\n }\n\n params(params: Record<string, string | number | boolean>): this {\n this.options.params = params\n return this\n }\n\n headers(headers: Record<string, string>): this {\n this.options.headers = { ...this.options.headers, ...headers }\n return this\n }\n\n timeout(timeout: number): this {\n this.options.timeout = timeout\n return this\n }\n\n cache(cache: RequestCache, key?: string): this {\n this.options.cache = cache\n this.cacheKey = key\n return this\n }\n\n /**\n * Configures retry behavior for failed requests.\n */\n retry(\n maxAttempts: number,\n options?: Omit<IgniterCallerRetryOptions, 'maxAttempts'>,\n ): this {\n this.retryOptions = { maxAttempts, ...options }\n return this\n }\n\n /**\n * Provides a fallback value if the request fails.\n */\n fallback<T>(fn: () => T): this {\n this.fallbackFn = fn\n return this\n }\n\n /**\n * Sets cache stale time in milliseconds.\n */\n stale(milliseconds: number): this {\n this.staleTime = milliseconds\n return this\n }\n\n responseType<T>(schema?: z.ZodSchema<T>): this {\n this.options.responseSchema = schema\n return this\n }\n\n /**\n * Downloads a file via GET request.\n */\n getFile(url: string) {\n this.options.method = 'GET'\n this.options.url = url\n\n return {\n execute: async (): Promise<IgniterCallerFileResponse> => {\n const {\n url: finalUrl,\n requestInit,\n controller,\n timeoutId,\n } = this.buildRequest()\n\n this.logger?.debug('IgniterCaller.getFile started', { url: finalUrl })\n\n try {\n const response = await fetch(finalUrl, {\n ...requestInit,\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => '')\n\n return {\n file: null,\n error: new IgniterCallerError({\n code: 'IGNITER_CALLER_HTTP_ERROR',\n operation: 'download',\n message: errorText || `HTTP error! status: ${response.status}`,\n statusText: response.statusText,\n statusCode: response.status,\n logger: this.logger,\n metadata: { url: finalUrl },\n }),\n }\n }\n\n const data = await response.blob()\n\n const contentType = response.headers.get('content-type')\n const extension = contentType?.split('/')[1]\n\n const filenameHeader = response.headers.get('content-disposition')\n const filename = filenameHeader?.split('filename=')[1]\n const filenameExtension = filename?.split('.').pop()\n\n // NOTE: Node 20+ includes `File` via undici. In older runtimes, this may not exist.\n if (typeof File === 'undefined') {\n return {\n file: null,\n error: new IgniterCallerError({\n code: 'IGNITER_CALLER_UNKNOWN_ERROR',\n operation: 'download',\n message:\n '`File` is not available in this runtime. Consider using `response.blob()` directly.',\n logger: this.logger,\n metadata: { url: finalUrl },\n }),\n }\n }\n\n const file = new File(\n [data],\n filename || `file.${extension || filenameExtension || 'unknown'}`,\n )\n\n this.logger?.info('IgniterCaller.getFile success', {\n url: finalUrl,\n size: file.size,\n type: file.type,\n })\n\n return { file, error: null }\n } catch (error) {\n clearTimeout(timeoutId)\n\n if (error instanceof Error && error.name === 'AbortError') {\n return {\n file: null,\n error: new IgniterCallerError({\n code: 'IGNITER_CALLER_TIMEOUT',\n operation: 'download',\n message: `Request timeout after ${this.options.timeout || 30000}ms`,\n statusCode: 408,\n logger: this.logger,\n metadata: { url: finalUrl },\n cause: error,\n }),\n }\n }\n\n return {\n file: null,\n error: new IgniterCallerError({\n code: 'IGNITER_CALLER_UNKNOWN_ERROR',\n operation: 'download',\n message: (error as Error)?.message || 'Failed to download file',\n logger: this.logger,\n metadata: { url: finalUrl },\n cause: error,\n }),\n }\n }\n },\n }\n }\n\n async execute<T = unknown>(): Promise<IgniterCallerApiResponse<T>> {\n // Check cache first if cache key is provided\n const effectiveCacheKey = this.cacheKey || this.options.url\n if (effectiveCacheKey && this.staleTime) {\n const cached = await IgniterCallerCacheUtils.get<T>(\n effectiveCacheKey,\n this.staleTime,\n )\n if (cached !== undefined) {\n this.logger?.debug('IgniterCaller.execute cache hit', {\n key: effectiveCacheKey,\n })\n const cachedResult = { data: cached, error: undefined }\n // Emit event for cached response\n await this.emitEvent(cachedResult)\n return cachedResult\n }\n }\n\n // Execute with retry logic\n const result = await this.executeWithRetry<T>()\n\n // Apply fallback if request failed\n if (result.error && this.fallbackFn) {\n this.logger?.debug('IgniterCaller.execute applying fallback', {\n error: result.error,\n })\n const fallbackResult = { data: this.fallbackFn() as T, error: undefined }\n await this.emitEvent(fallbackResult)\n return fallbackResult\n }\n\n // Store in cache if successful and cache key is provided\n if (!result.error && result.data !== undefined && effectiveCacheKey) {\n await IgniterCallerCacheUtils.set(\n effectiveCacheKey,\n result.data,\n this.staleTime,\n )\n }\n\n // Emit event for response\n await this.emitEvent(result)\n\n return result\n }\n\n private async executeWithRetry<T>(): Promise<IgniterCallerApiResponse<T>> {\n const maxAttempts = this.retryOptions?.maxAttempts || 1\n const baseDelay = this.retryOptions?.baseDelay || 1000\n const backoff = this.retryOptions?.backoff || 'linear'\n const retryOnStatus = this.retryOptions?.retryOnStatus || [\n 408, 429, 500, 502, 503, 504,\n ]\n\n let lastError: Error | undefined\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n if (attempt > 0) {\n const delay =\n backoff === 'exponential'\n ? baseDelay * 2 ** (attempt - 1)\n : baseDelay * attempt\n\n this.logger?.debug('IgniterCaller.execute retrying', {\n attempt,\n delay,\n })\n\n await new Promise((resolve) => setTimeout(resolve, delay))\n }\n\n const result = await this.executeSingleRequest<T>()\n\n // Success case\n if (!result.error) {\n return result\n }\n\n // Check if we should retry based on status code\n const shouldRetry =\n result.error instanceof IgniterCallerError &&\n result.error.statusCode &&\n retryOnStatus.includes(result.error.statusCode)\n\n if (!shouldRetry || attempt === maxAttempts - 1) {\n return result\n }\n\n lastError = result.error\n }\n\n return {\n data: undefined,\n error: lastError,\n }\n }\n\n private async executeSingleRequest<T>(): Promise<\n IgniterCallerApiResponse<T>\n > {\n const { responseSchema } = this.options\n let { url, requestInit, controller, timeoutId } = this.buildRequest()\n\n this.logger?.debug('IgniterCaller.execute started', {\n method: this.options.method,\n url,\n })\n\n // Apply request interceptors\n if (this.requestInterceptors && this.requestInterceptors.length > 0) {\n let modifiedOptions = { ...this.options, url }\n for (const interceptor of this.requestInterceptors) {\n modifiedOptions = await interceptor(modifiedOptions)\n }\n // Rebuild request with intercepted options\n this.options = modifiedOptions\n const rebuilt = this.buildRequest()\n url = rebuilt.url\n requestInit = rebuilt.requestInit\n controller = rebuilt.controller\n timeoutId = rebuilt.timeoutId\n }\n\n // Validate request body if schema exists\n if (this.schemas && this.options.body) {\n const { schema: endpointSchema } = IgniterCallerSchemaUtils.findSchema(\n this.schemas,\n url,\n this.options.method,\n )\n\n if (endpointSchema?.request) {\n try {\n await IgniterCallerSchemaUtils.validateRequest(\n this.options.body,\n endpointSchema.request,\n this.schemaValidation,\n { url, method: this.options.method },\n this.logger,\n )\n } catch (error) {\n // Validation failed in strict mode\n return {\n data: undefined,\n error: error as IgniterCallerError,\n }\n }\n }\n }\n\n try {\n const httpResponse = await fetch(url, {\n ...requestInit,\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n if (!httpResponse.ok) {\n const errorText = await httpResponse.text().catch(() => '')\n\n return {\n data: undefined,\n error: new IgniterCallerError({\n code: 'IGNITER_CALLER_HTTP_ERROR',\n operation: 'execute',\n message: errorText || `HTTP error! status: ${httpResponse.status}`,\n statusText: httpResponse.statusText,\n statusCode: httpResponse.status,\n logger: this.logger,\n metadata: {\n method: this.options.method,\n url,\n },\n }),\n }\n }\n\n const contentType = httpResponse.headers.get('content-type')\n const data: unknown = contentType?.includes('application/json')\n ? await httpResponse.json()\n : await httpResponse.text()\n\n // Validate response using StandardSchemaV1 if schemas exist\n let validatedData: unknown = data\n if (this.schemas) {\n const { schema: endpointSchema } = IgniterCallerSchemaUtils.findSchema(\n this.schemas,\n url,\n this.options.method,\n )\n\n const responseSchema =\n endpointSchema?.responses?.[httpResponse.status]\n\n if (responseSchema) {\n try {\n validatedData = await IgniterCallerSchemaUtils.validateResponse(\n data,\n responseSchema,\n httpResponse.status,\n this.schemaValidation,\n { url, method: this.options.method },\n this.logger,\n )\n } catch (error) {\n // Validation failed in strict mode\n return {\n data: undefined,\n error: error as IgniterCallerError,\n }\n }\n }\n }\n\n // Legacy Zod support (if responseSchema option is used)\n if (responseSchema) {\n const result = responseSchema.safeParse(data)\n if (!result.success) {\n return {\n data: undefined,\n error: new IgniterCallerError({\n code: 'IGNITER_CALLER_RESPONSE_VALIDATION_FAILED',\n operation: 'parseResponse',\n message: `Response validation failed: ${result.error.message}`,\n logger: this.logger,\n statusCode: 500,\n metadata: {\n method: this.options.method,\n url,\n },\n cause: result.error,\n }),\n }\n }\n\n let response: IgniterCallerApiResponse<T> = {\n data: result.data as T,\n error: undefined,\n }\n\n // Apply response interceptors\n if (this.responseInterceptors && this.responseInterceptors.length > 0) {\n for (const interceptor of this.responseInterceptors) {\n response = await interceptor(response)\n }\n }\n\n return response\n }\n\n let response: IgniterCallerApiResponse<T> = {\n data: validatedData as T,\n error: undefined,\n }\n\n // Apply response interceptors\n if (this.responseInterceptors && this.responseInterceptors.length > 0) {\n for (const interceptor of this.responseInterceptors) {\n response = await interceptor(response)\n }\n }\n\n return response\n } catch (error) {\n clearTimeout(timeoutId)\n\n if (error instanceof Error && error.name === 'AbortError') {\n return {\n data: undefined,\n error: new IgniterCallerError({\n code: 'IGNITER_CALLER_TIMEOUT',\n operation: 'execute',\n message: `Request timeout after ${this.options.timeout || 30000}ms`,\n statusCode: 408,\n logger: this.logger,\n metadata: {\n method: this.options.method,\n url,\n },\n cause: error,\n }),\n }\n }\n\n return {\n data: undefined,\n error: new IgniterCallerError({\n code: 'IGNITER_CALLER_UNKNOWN_ERROR',\n operation: 'execute',\n message:\n (error as Error)?.message ||\n 'Unknown error occurred during request',\n statusCode: 500,\n logger: this.logger,\n metadata: {\n method: this.options.method,\n url,\n },\n cause: error,\n }),\n }\n }\n }\n\n private buildRequest() {\n const { method, url, body, params, headers, timeout, baseURL, cache } =\n this.options\n\n const fullUrl = IgniterCallerUrlUtils.buildUrl({\n url,\n baseURL,\n query: params,\n })\n\n const rawBody = IgniterCallerBodyUtils.isRawBody(body)\n const finalHeaders = IgniterCallerBodyUtils.normalizeHeadersForBody(\n headers,\n body,\n )\n\n const requestInit: RequestInit = {\n method,\n headers: finalHeaders,\n cache,\n ...(body && method !== 'GET' && method !== 'HEAD'\n ? { body: rawBody ? (body as any) : JSON.stringify(body) }\n : {}),\n }\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeout || 30000)\n\n return {\n url: fullUrl,\n requestInit,\n controller,\n timeoutId,\n }\n }\n\n /**\n * Emits event for this response using injected emitter.\n */\n private async emitEvent<T>(\n result: IgniterCallerApiResponse<T>,\n ): Promise<void> {\n if (this.eventEmitter) {\n try {\n await this.eventEmitter(this.options.url, this.options.method, result)\n } catch (error) {\n // Silently fail if event emission fails\n this.logger?.debug('Failed to emit event', { error })\n }\n }\n }\n}\n","import type {\n IgniterCallerEventCallback,\n IgniterCallerUrlPattern,\n} from '../types/events'\n\n/**\n * Event emitter for observing HTTP responses across the application.\n *\n * This allows developers to listen to API responses globally for:\n * - Debugging and logging\n * - Real-time monitoring\n * - Cache invalidation triggers\n * - Analytics and telemetry\n */\nexport class IgniterCallerEvents {\n private listeners = new Map<string, Set<IgniterCallerEventCallback>>()\n private patternListeners = new Map<RegExp, Set<IgniterCallerEventCallback>>()\n\n /**\n * Registers a listener for a specific URL or pattern.\n *\n * @param pattern URL string (exact match) or RegExp pattern\n * @param callback Function to execute when a response matches\n * @returns Cleanup function to remove the listener\n *\n * @example\n * ```ts\n * // Listen to specific endpoint\n * const cleanup = api.on('/users', (result) => {\n * console.log('Users fetched:', result.data)\n * })\n *\n * // Listen to pattern\n * api.on(/^\\/users\\/\\d+$/, (result) => {\n * console.log('User detail fetched')\n * })\n *\n * // Cleanup when done\n * cleanup()\n * ```\n */\n on(pattern: IgniterCallerUrlPattern, callback: IgniterCallerEventCallback): () => void {\n if (typeof pattern === 'string') {\n if (!this.listeners.has(pattern)) {\n this.listeners.set(pattern, new Set())\n }\n const callbacks = this.listeners.get(pattern)\n if (callbacks) {\n callbacks.add(callback)\n }\n\n // Return cleanup function\n return () => {\n const callbacks = this.listeners.get(pattern)\n if (callbacks) {\n callbacks.delete(callback)\n if (callbacks.size === 0) {\n this.listeners.delete(pattern)\n }\n }\n }\n }\n\n // RegExp pattern\n if (!this.patternListeners.has(pattern)) {\n this.patternListeners.set(pattern, new Set())\n }\n const callbacks = this.patternListeners.get(pattern)\n if (callbacks) {\n callbacks.add(callback)\n }\n\n return () => {\n const callbacks = this.patternListeners.get(pattern)\n if (callbacks) {\n callbacks.delete(callback)\n if (callbacks.size === 0) {\n this.patternListeners.delete(pattern)\n }\n }\n }\n }\n\n /**\n * Removes a specific listener or all listeners for a pattern.\n */\n off(pattern: IgniterCallerUrlPattern, callback?: IgniterCallerEventCallback): void {\n if (typeof pattern === 'string') {\n if (callback !== undefined) {\n this.listeners.get(pattern)?.delete(callback)\n } else {\n this.listeners.delete(pattern)\n }\n } else {\n if (callback !== undefined) {\n this.patternListeners.get(pattern)?.delete(callback)\n } else {\n this.patternListeners.delete(pattern)\n }\n }\n }\n\n /**\n * Emits an event to all matching listeners.\n *\n * @internal\n */\n async emit(url: string, method: string, result: any): Promise<void> {\n const context = {\n url,\n method,\n timestamp: Date.now(),\n }\n\n // Exact match listeners\n const exactListeners = this.listeners.get(url)\n if (exactListeners) {\n for (const callback of exactListeners) {\n try {\n await callback(result, context)\n } catch (error) {\n console.error('Error in IgniterCaller event listener:', error)\n }\n }\n }\n\n // Pattern match listeners\n for (const [pattern, callbacks] of this.patternListeners.entries()) {\n if (pattern.test(url)) {\n for (const callback of callbacks) {\n try {\n await callback(result, context)\n } catch (error) {\n console.error('Error in IgniterCaller event listener:', error)\n }\n }\n }\n }\n }\n\n /**\n * Removes all listeners.\n */\n clear(): void {\n this.listeners.clear()\n this.patternListeners.clear()\n }\n}\n","import type { IgniterLogger } from '@igniter-js/core'\nimport { IgniterCallerBuilder } from '../builder/igniter-caller.builder'\nimport { IgniterCallerRequestBuilder } from '../builder/igniter-caller-request.builder'\nimport type {\n IgniterCallerEventCallback,\n IgniterCallerUrlPattern,\n} from '../types/events'\nimport type {\n IgniterCallerRequestInterceptor,\n IgniterCallerResponseInterceptor,\n} from '../types/interceptors'\nimport type { IgniterCallerApiResponse } from '../types/response'\nimport type {\n IgniterCallerSchemaMap,\n IgniterCallerSchemaValidationOptions,\n} from '../types/schemas'\nimport { IgniterCallerCacheUtils } from '../utils/cache'\nimport { IgniterCallerEvents } from './igniter-caller-events'\n\n/**\n * HTTP client runtime for Igniter.js.\n *\n * This module is intentionally structured to be extracted into a standalone package\n * in the Igniter.js ecosystem as `@igniter-js/caller`.\n */\nexport class IgniterCaller {\n /** Global event emitter for observing HTTP responses */\n private static readonly events = new IgniterCallerEvents()\n\n private baseURL?: string\n private headers?: Record<string, string>\n private cookies?: Record<string, string>\n private logger?: IgniterLogger\n private requestInterceptors?: IgniterCallerRequestInterceptor[]\n private responseInterceptors?: IgniterCallerResponseInterceptor[]\n private schemas?: IgniterCallerSchemaMap\n private schemaValidation?: IgniterCallerSchemaValidationOptions\n\n constructor(\n baseURL?: string,\n opts?: {\n headers?: Record<string, string>\n cookies?: Record<string, string>\n logger?: IgniterLogger\n requestInterceptors?: IgniterCallerRequestInterceptor[]\n responseInterceptors?: IgniterCallerResponseInterceptor[]\n schemas?: IgniterCallerSchemaMap\n schemaValidation?: IgniterCallerSchemaValidationOptions\n },\n ) {\n this.baseURL = baseURL\n this.headers = opts?.headers\n this.cookies = opts?.cookies\n this.logger = opts?.logger\n this.requestInterceptors = opts?.requestInterceptors\n this.responseInterceptors = opts?.responseInterceptors\n this.schemas = opts?.schemas\n this.schemaValidation = opts?.schemaValidation\n }\n\n /**\n * Canonical initialization entrypoint.\n *\n * This is designed to remain stable when extracted to `@igniter-js/caller`.\n */\n static create(): IgniterCallerBuilder<IgniterCaller> {\n return IgniterCallerBuilder.create((state) => {\n // Configure store if provided\n if (state.store) {\n IgniterCallerCacheUtils.setStore(state.store, state.storeOptions)\n }\n\n return new IgniterCaller(state.baseURL, {\n headers: state.headers,\n cookies: state.cookies,\n logger: state.logger,\n requestInterceptors: state.requestInterceptors,\n responseInterceptors: state.responseInterceptors,\n schemas: state.schemas,\n schemaValidation: state.schemaValidation,\n })\n })\n }\n\n /**\n * Returns a new client with the same config and a new logger.\n */\n withLogger(logger: IgniterLogger): IgniterCaller {\n return new IgniterCaller(this.baseURL, {\n headers: this.headers,\n cookies: this.cookies,\n logger,\n requestInterceptors: this.requestInterceptors,\n responseInterceptors: this.responseInterceptors,\n schemas: this.schemas,\n schemaValidation: this.schemaValidation,\n })\n }\n\n setBaseURL(baseURL: string): this {\n this.baseURL = baseURL\n return this\n }\n\n setHeaders(headers: Record<string, string>): this {\n this.headers = headers\n return this\n }\n\n setCookies(cookies: Record<string, string>): this {\n this.cookies = cookies\n return this\n }\n\n get(): IgniterCallerRequestBuilder {\n return new IgniterCallerRequestBuilder({\n baseURL: this.baseURL,\n defaultHeaders: this.headers,\n defaultCookies: this.cookies,\n logger: this.logger,\n requestInterceptors: this.requestInterceptors,\n responseInterceptors: this.responseInterceptors,\n eventEmitter: async (url, method, result) => {\n await IgniterCaller.emitEvent(url, method, result)\n },\n schemas: this.schemas,\n schemaValidation: this.schemaValidation,\n }).method('GET')\n }\n\n post(): IgniterCallerRequestBuilder {\n return new IgniterCallerRequestBuilder({\n baseURL: this.baseURL,\n defaultHeaders: this.headers,\n defaultCookies: this.cookies,\n logger: this.logger,\n requestInterceptors: this.requestInterceptors,\n responseInterceptors: this.responseInterceptors,\n eventEmitter: async (url, method, result) => {\n await IgniterCaller.emitEvent(url, method, result)\n },\n schemas: this.schemas,\n schemaValidation: this.schemaValidation,\n }).method('POST')\n }\n\n put(): IgniterCallerRequestBuilder {\n return new IgniterCallerRequestBuilder({\n baseURL: this.baseURL,\n defaultHeaders: this.headers,\n defaultCookies: this.cookies,\n logger: this.logger,\n requestInterceptors: this.requestInterceptors,\n responseInterceptors: this.responseInterceptors,\n eventEmitter: async (url, method, result) => {\n await IgniterCaller.emitEvent(url, method, result)\n },\n schemas: this.schemas,\n schemaValidation: this.schemaValidation,\n }).method('PUT')\n }\n\n patch(): IgniterCallerRequestBuilder {\n return new IgniterCallerRequestBuilder({\n baseURL: this.baseURL,\n defaultHeaders: this.headers,\n defaultCookies: this.cookies,\n logger: this.logger,\n requestInterceptors: this.requestInterceptors,\n responseInterceptors: this.responseInterceptors,\n eventEmitter: async (url, method, result) => {\n await IgniterCaller.emitEvent(url, method, result)\n },\n schemas: this.schemas,\n schemaValidation: this.schemaValidation,\n }).method('PATCH')\n }\n\n delete(): IgniterCallerRequestBuilder {\n return new IgniterCallerRequestBuilder({\n baseURL: this.baseURL,\n defaultHeaders: this.headers,\n defaultCookies: this.cookies,\n logger: this.logger,\n requestInterceptors: this.requestInterceptors,\n responseInterceptors: this.responseInterceptors,\n eventEmitter: async (url, method, result) => {\n await IgniterCaller.emitEvent(url, method, result)\n },\n schemas: this.schemas,\n schemaValidation: this.schemaValidation,\n }).method('DELETE')\n }\n\n request(): IgniterCallerRequestBuilder {\n return new IgniterCallerRequestBuilder({\n baseURL: this.baseURL,\n defaultHeaders: this.headers,\n defaultCookies: this.cookies,\n logger: this.logger,\n requestInterceptors: this.requestInterceptors,\n responseInterceptors: this.responseInterceptors,\n eventEmitter: async (url, method, result) => {\n await IgniterCaller.emitEvent(url, method, result)\n },\n })\n }\n\n /**\n * Executes multiple requests in parallel and returns results as an array.\n *\n * This is useful for batching independent API calls.\n */\n static async batch<\n T extends readonly Promise<IgniterCallerApiResponse<any>>[],\n >(\n requests: [...T],\n ): Promise<{\n [K in keyof T]: T[K] extends Promise<infer R> ? R : never\n }> {\n return Promise.all(requests) as any\n }\n\n /**\n * Registers a global event listener for HTTP responses.\n *\n * This allows observing API responses across the application for:\n * - Debugging and logging\n * - Real-time monitoring\n * - Cache invalidation triggers\n * - Analytics and telemetry\n *\n * @param pattern URL string (exact match) or RegExp pattern\n * @param callback Function to execute when a response matches\n * @returns Cleanup function to remove the listener\n *\n * @example\n * ```ts\n * // Listen to all user endpoints\n * const cleanup = IgniterCaller.on(/^\\/users/, (result, context) => {\n * console.log(`${context.method} ${context.url}`, result)\n * })\n *\n * // Cleanup when done\n * cleanup()\n * ```\n */\n static on(\n pattern: IgniterCallerUrlPattern,\n callback: IgniterCallerEventCallback,\n ): () => void {\n return IgniterCaller.events.on(pattern, callback)\n }\n\n /**\n * Removes event listeners for a pattern.\n */\n static off(\n pattern: IgniterCallerUrlPattern,\n callback?: IgniterCallerEventCallback,\n ): void {\n IgniterCaller.events.off(pattern, callback)\n }\n\n /**\n * Invalidates a specific cache entry.\n *\n * This is useful after mutations to ensure fresh data on next fetch.\n *\n * @example\n * ```ts\n * // After creating a user\n * await api.post().url('/users').body(newUser).execute()\n * await IgniterCaller.invalidate('/users') // Clear users list cache\n * ```\n */\n static async invalidate(key: string): Promise<void> {\n await IgniterCallerCacheUtils.clear(key)\n }\n\n /**\n * Invalidates all cache entries matching a pattern.\n *\n * @param pattern Glob pattern (e.g., '/users/*') or exact key\n *\n * @example\n * ```ts\n * // Invalidate all user-related caches\n * await IgniterCaller.invalidatePattern('/users/*')\n * ```\n */\n static async invalidatePattern(pattern: string): Promise<void> {\n await IgniterCallerCacheUtils.clearPattern(pattern)\n }\n\n /**\n * Emits an event to all registered listeners.\n *\n * @internal\n */\n static async emitEvent(\n url: string,\n method: string,\n result: IgniterCallerApiResponse<any>,\n ): Promise<void> {\n await IgniterCaller.events.emit(url, method, result)\n }\n}\n","import {\n IgniterCallerError,\n type IgniterCallerErrorCode,\n} from '../errors/igniter-caller.error'\nimport type {\n IgniterCallerApiResponse,\n IgniterCallerFileResponse,\n} from '../types/response'\n\n/**\n * Testing utilities for `IgniterCaller`.\n *\n * Designed to simplify mocking HTTP responses in unit tests.\n */\nexport class IgniterCallerMock {\n /**\n * Creates a successful mock response.\n */\n static mockResponse<T>(data: T): IgniterCallerApiResponse<T> {\n return { data, error: undefined }\n }\n\n /**\n * Creates an error mock response.\n */\n static mockError<T = never>(\n code: IgniterCallerErrorCode,\n message = 'Mock error',\n ): IgniterCallerApiResponse<T> {\n return {\n data: undefined,\n error: new IgniterCallerError({\n code,\n operation: 'execute',\n message,\n }),\n }\n }\n\n /**\n * Creates a successful file download mock.\n */\n static mockFile(\n filename: string,\n content: string | Blob,\n ): IgniterCallerFileResponse {\n const blob = typeof content === 'string' ? new Blob([content]) : content\n const file = new File([blob], filename)\n\n return { file, error: null }\n }\n\n /**\n * Creates a failed file download mock.\n */\n static mockFileError(message = 'Mock file error'): IgniterCallerFileResponse {\n return {\n file: null,\n error: new IgniterCallerError({\n code: 'IGNITER_CALLER_UNKNOWN_ERROR',\n operation: 'download',\n message,\n }),\n }\n }\n}\n"]}