@runapi.ai/core
Advanced tools
+22
-1
@@ -620,2 +620,6 @@ "use strict"; | ||
| function validateSchemaField(params, field, rules) { | ||
| const value = params[field]; | ||
| if (value != null && ("min_items" in rules || "max_items" in rules)) { | ||
| validateSchemaItemCount(field, value, rules); | ||
| } | ||
| const present = fieldPresent(params, field); | ||
@@ -626,3 +630,2 @@ if (rules.required && !present) { | ||
| if (!present) return; | ||
| const value = params[field]; | ||
| if (rules.enum !== void 0 && !enumValueAllowed(rules.enum, value)) { | ||
@@ -638,2 +641,20 @@ throw new ValidationError(`${field} must be one of: ${formatEnumValues(rules.enum)}`); | ||
| } | ||
| function validateSchemaItemCount(field, value, rules) { | ||
| if (!Array.isArray(value)) { | ||
| throw new ValidationError(`${field} must be an array`); | ||
| } | ||
| const min = rules.min_items; | ||
| const max = rules.max_items; | ||
| if ((min == null || value.length >= min) && (max == null || value.length <= max)) return; | ||
| throw new ValidationError(itemCountMessage(field, min, max)); | ||
| } | ||
| function itemCountMessage(field, min, max) { | ||
| if (min != null && max != null) { | ||
| return `${field} must contain between ${formatValue(min)} and ${formatValue(max)} items`; | ||
| } | ||
| if (min != null) { | ||
| return `${field} must contain at least ${formatValue(min)} items`; | ||
| } | ||
| return `${field} must contain at most ${formatValue(max)} items`; | ||
| } | ||
| function validateSchemaInteger(field, value, rules) { | ||
@@ -640,0 +661,0 @@ if (typeof value === "number" && Number.isInteger(value)) return; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/retry.ts","../src/errors.ts","../src/auth.ts","../src/http.ts","../src/params.ts","../src/validate.ts","../src/md5.ts","../src/files.ts","../src/account.ts","../src/base-client.ts"],"sourcesContent":["// Types\nexport type {\n HttpMethod,\n QueryParams,\n ClientOptions,\n RequestOptions,\n PollingOptions,\n TaskStatus,\n AsyncTaskStatus,\n TaskResponse,\n} from './types';\n\n// Constants\nexport { TIMEOUTS, RETRY_CONFIG, DEFAULT_BASE_URL, SDK_USER_AGENT } from './constants';\n\n// Errors\nexport {\n RunApiError,\n AuthenticationError,\n RateLimitError,\n InsufficientCreditsError,\n NotFoundError,\n ValidationError,\n ServiceUnavailableError,\n NetworkError,\n TimeoutError,\n TaskTimeoutError,\n TaskFailedError,\n errorFromResponse,\n} from './errors';\nexport type { RunApiErrorOptions } from './errors';\n\n// Auth\nexport { resolveApiKey } from './auth';\n\n// HTTP Client\nexport { createHttpClient } from './http';\nexport type { HttpClient, HttpRequestOptions } from './http';\n\n// Retry (高级用户可用)\nexport {\n getRetryDelayMs,\n isRetryableStatus,\n isIdempotentMethod,\n parseRetryAfterMs,\n} from './retry';\nexport type { RetryOptions } from './retry';\n\n// Params\nexport { compactParams } from './params';\n\n// Contract validation\nexport { validateParams } from './validate';\nexport type { ActionSchema } from './validate';\n\n// Files\nexport { Files } from './files';\nexport type { FileCreateParams, FileSource, FileUploadResponse } from './files';\n\n// Account\nexport { Account } from './account';\nexport type { AccountInfoResponse, AccountBalanceResponse } from './account';\n\n// Base client\nexport { BaseClient } from './base-client';\n\n// Version\nexport const version = '0.1.0';\n\n// Note: pollUntilComplete 不从主入口导出,避免 PollingOptions 类型暴露\n// 各 API 包(suno/veo-3-1 等)通过 '@runapi.ai/core/internal' 导入\n","/**\n * Default timeout constants for SDK operations.\n * All values are in milliseconds.\n */\nexport const TIMEOUTS = {\n /**\n * Default HTTP request timeout (15 minutes).\n * AI generation APIs can take significant time to complete.\n */\n HTTP_REQUEST: 900000,\n\n /**\n * Default polling timeout (15 minutes).\n * Matches HTTP_REQUEST to allow long-running tasks to complete.\n */\n POLLING_MAX_WAIT: 900000,\n\n /**\n * Default polling interval (2 seconds).\n * How often to check task status during polling.\n */\n POLLING_INTERVAL: 2000,\n} as const;\n\n/**\n * Default retry configuration for HTTP requests.\n */\nexport const RETRY_CONFIG = {\n /**\n * Maximum number of retry attempts.\n */\n MAX_RETRIES: 2,\n\n /**\n * Base delay between retries (500ms).\n * Actual delay uses exponential backoff.\n */\n BASE_DELAY: 500,\n\n /**\n * Maximum delay between retries (5 seconds).\n * Caps the exponential backoff.\n */\n MAX_DELAY: 5000,\n} as const;\n\n/**\n * Default base URL for RunAPI services.\n */\nexport const DEFAULT_BASE_URL = 'https://runapi.ai';\n\n/**\n * SDK user agent string.\n */\nexport const SDK_USER_AGENT = 'runapi-sdk-js';\n","export interface RetryOptions {\n maxRetries: number;\n baseDelayMs: number;\n maxDelayMs: number;\n}\n\nexport function getRetryDelayMs(\n attempt: number,\n baseDelayMs: number,\n maxDelayMs: number\n): number {\n const exponential = baseDelayMs * Math.pow(2, attempt);\n const capped = Math.min(exponential, maxDelayMs);\n const jitter = Math.random() * capped * 0.5;\n return Math.min(maxDelayMs, capped + jitter);\n}\n\nexport function isRetryableStatus(status: number): boolean {\n return status === 429 || status >= 500;\n}\n\nexport function isIdempotentMethod(method: string): boolean {\n return ['GET', 'HEAD', 'PUT', 'DELETE', 'OPTIONS'].includes(method);\n}\n\nexport function parseRetryAfterMs(response: Response): number | undefined {\n const retryAfter = response.headers.get('retry-after');\n if (!retryAfter) {\n return undefined;\n }\n\n const numeric = Number(retryAfter);\n if (!Number.isNaN(numeric)) {\n return numeric * 1000;\n }\n\n const dateMs = Date.parse(retryAfter);\n if (!Number.isNaN(dateMs)) {\n return Math.max(0, dateMs - Date.now());\n }\n\n return undefined;\n}\n","import { parseRetryAfterMs } from './retry';\n\n/** Options for constructing RunApiError instances. */\nexport interface RunApiErrorOptions extends ErrorOptions {\n /** Explicit machine-readable reason. */\n code?: string;\n /** HTTP status code. */\n status?: number;\n /** Request ID from `X-Request-ID` header. */\n requestId?: string;\n /** Additional error details from response body. */\n details?: unknown;\n}\n\n/**\n * Base error class for all RunAPI SDK errors.\n * Includes HTTP status, request ID, and response details.\n */\nexport class RunApiError extends Error {\n /** Explicit machine-readable reason when one was provided. */\n code?: string;\n /** HTTP status code if available. */\n status?: number;\n /** Request ID from response headers. */\n requestId?: string;\n /** Parsed response body or error details. */\n details?: unknown;\n\n constructor(message: string, options: RunApiErrorOptions = {}) {\n super(message, options);\n this.name = 'RunApiError';\n this.code = options.code;\n this.status = options.status;\n this.requestId = options.requestId;\n this.details = options.details;\n }\n}\n\n/** Thrown when API key is missing or invalid (HTTP 401). */\nexport class AuthenticationError extends RunApiError {\n constructor(message: string, options: RunApiErrorOptions = {}) {\n super(message, { code: 'authentication', ...options });\n this.name = 'AuthenticationError';\n }\n}\n\n/** Thrown when rate limit is exceeded (HTTP 429). Includes retry-after delay. */\nexport class RateLimitError extends RunApiError {\n /** Suggested retry delay in milliseconds from `Retry-After` header. */\n retryAfterMs?: number;\n\n constructor(\n message: string,\n options: RunApiErrorOptions & { retryAfterMs?: number } = {}\n ) {\n super(message, { code: 'rate_limit', ...options });\n this.name = 'RateLimitError';\n this.retryAfterMs = options.retryAfterMs;\n }\n}\n\n/** Thrown when account has insufficient credits (HTTP 402). */\nexport class InsufficientCreditsError extends RunApiError {\n constructor(message: string, options: RunApiErrorOptions = {}) {\n super(message, { code: 'insufficient_credits', ...options });\n this.name = 'InsufficientCreditsError';\n }\n}\n\n/** Thrown when requested resource does not exist (HTTP 404). */\nexport class NotFoundError extends RunApiError {\n constructor(message: string, options: RunApiErrorOptions = {}) {\n super(message, { code: 'not_found', ...options });\n this.name = 'NotFoundError';\n }\n}\n\n/** Thrown when request validation fails (HTTP 400, 422). */\nexport class ValidationError extends RunApiError {\n constructor(message: string, options: RunApiErrorOptions = {}) {\n super(message, { code: 'validation', ...options });\n this.name = 'ValidationError';\n }\n}\n\n/** Thrown when a request conflicts with current resource state (HTTP 409). */\nexport class ConflictError extends RunApiError {\n constructor(message: string, options: RunApiErrorOptions = {}) {\n super(message, { code: 'conflict', ...options });\n this.name = 'ConflictError';\n }\n}\n\n/** Thrown when service is temporarily unavailable (HTTP 503). */\nexport class ServiceUnavailableError extends RunApiError {\n constructor(message: string, options: RunApiErrorOptions = {}) {\n super(message, { code: 'service_unavailable', ...options });\n this.name = 'ServiceUnavailableError';\n }\n}\n\n/** Thrown when network connection fails or request cannot be sent. */\nexport class NetworkError extends RunApiError {\n constructor(message: string, options: RunApiErrorOptions = {}) {\n super(message, { code: 'network', ...options });\n this.name = 'NetworkError';\n }\n}\n\n/** Thrown when HTTP request exceeds configured timeout. */\nexport class TimeoutError extends RunApiError {\n constructor(message: string, options: RunApiErrorOptions = {}) {\n super(message, { code: 'timeout', ...options });\n this.name = 'TimeoutError';\n }\n}\n\n/** Thrown when polling for task completion exceeds maximum wait time. */\nexport class TaskTimeoutError extends RunApiError {\n constructor(message: string, options: RunApiErrorOptions = {}) {\n super(message, { code: 'task_timeout', ...options });\n this.name = 'TaskTimeoutError';\n }\n}\n\n/** Thrown when async task fails during processing. */\nexport class TaskFailedError extends RunApiError {\n constructor(message: string, options: RunApiErrorOptions = {}) {\n super(message, { code: 'task_failed', ...options });\n this.name = 'TaskFailedError';\n }\n}\n\nconst DEFAULT_ERROR_MESSAGE = 'Request failed';\n\n// Detect HTML error pages from proxies/gateways to avoid leaking raw markup as message.\nconst HTML_MARKER = /<!doctype|<html/i;\n\nfunction extractMessageFromUnknown(value: unknown): string | undefined {\n if (typeof value === 'string' && value.trim()) {\n return value.trim();\n }\n\n if (value && typeof value === 'object') {\n const maybeMessage = (value as { message?: unknown }).message;\n if (typeof maybeMessage === 'string' && maybeMessage.trim()) {\n return maybeMessage.trim();\n }\n const maybeDetail = (value as { detail?: unknown }).detail;\n if (typeof maybeDetail === 'string' && maybeDetail.trim()) {\n return maybeDetail.trim();\n }\n }\n\n return undefined;\n}\n\nfunction extractErrorMessage(body: unknown): string | undefined {\n if (typeof body === 'string') {\n if (!body.trim()) {\n return undefined;\n }\n if (HTML_MARKER.test(body)) {\n return undefined;\n }\n return body.trim();\n }\n\n if (!body || typeof body !== 'object') {\n return undefined;\n }\n\n const maybeError = (body as { error?: unknown }).error;\n const errorMessage = extractMessageFromUnknown(maybeError);\n if (errorMessage) {\n return errorMessage;\n }\n\n const maybeErrors = (body as { errors?: unknown }).errors;\n if (Array.isArray(maybeErrors) && maybeErrors.length > 0) {\n const firstString = maybeErrors.find((item) => typeof item === 'string');\n if (typeof firstString === 'string') {\n return firstString;\n }\n const firstObject = maybeErrors.find(\n (item) => item && typeof item === 'object'\n );\n const objectMessage = extractMessageFromUnknown(firstObject);\n if (objectMessage) {\n return objectMessage;\n }\n }\n\n const maybeMessage = (body as { message?: unknown }).message;\n if (typeof maybeMessage === 'string' && maybeMessage.trim()) {\n return maybeMessage.trim();\n }\n\n const maybeDetail = (body as { detail?: unknown }).detail;\n if (typeof maybeDetail === 'string' && maybeDetail.trim()) {\n return maybeDetail.trim();\n }\n\n const maybeErrorMessage = (body as { errorMessage?: unknown }).errorMessage;\n if (typeof maybeErrorMessage === 'string' && maybeErrorMessage.trim()) {\n return maybeErrorMessage.trim();\n }\n\n const maybeMsg = (body as { msg?: unknown }).msg;\n if (typeof maybeMsg === 'string' && maybeMsg.trim()) {\n return maybeMsg.trim();\n }\n\n return undefined;\n}\n\nfunction extractErrorCode(body: unknown): string | undefined {\n if (!body || typeof body !== 'object') {\n return undefined;\n }\n\n const error = (body as { error?: unknown }).error;\n if (!error || typeof error !== 'object') {\n return undefined;\n }\n\n const code = (error as { code?: unknown }).code;\n return typeof code === 'string' && code.trim() ? code : undefined;\n}\n\nfunction defaultMessageForStatus(status: number): string {\n switch (status) {\n case 400:\n return 'Bad request';\n case 401:\n return 'Unauthorized';\n case 402:\n return 'Insufficient credits';\n case 404:\n return 'Not found';\n case 409:\n return 'Conflict';\n case 408:\n return 'Request timeout';\n case 413:\n return 'Payload too large';\n case 415:\n return 'Unsupported media type';\n case 422:\n return 'Validation failed';\n case 429:\n return 'Too many requests';\n case 503:\n return 'Service unavailable';\n default:\n if (status >= 500) {\n return 'Server error';\n }\n return DEFAULT_ERROR_MESSAGE;\n }\n}\n\n/**\n * Constructs appropriate error class from HTTP response.\n * Maps status codes to specific error types and extracts error messages.\n *\n * @param response - HTTP Response object\n * @param bodyText - Response body as text\n * @param bodyJson - Parsed JSON body if available\n * @returns Specific error instance based on status code\n */\nexport function errorFromResponse(\n response: Response,\n bodyText: string | null,\n bodyJson?: unknown\n): RunApiError {\n const status = response.status;\n const requestId = response.headers.get('x-request-id') || undefined;\n const messageFromBody =\n extractErrorMessage(bodyJson) || extractErrorMessage(bodyText);\n const message = messageFromBody || defaultMessageForStatus(status);\n const details = bodyJson ?? bodyText ?? undefined;\n const code = extractErrorCode(bodyJson);\n\n if (status === 401) {\n return new AuthenticationError(message, { code, status, requestId, details });\n }\n if (status === 402) {\n return new InsufficientCreditsError(message, { code, status, requestId, details });\n }\n if (status === 404) {\n return new NotFoundError(message, { code, status, requestId, details });\n }\n if (status === 422 || status === 400) {\n return new ValidationError(message, { code, status, requestId, details });\n }\n if (status === 409) {\n return new ConflictError(message, { code, status, requestId, details });\n }\n if (status === 429) {\n return new RateLimitError(message, {\n status,\n code,\n requestId,\n details,\n retryAfterMs: parseRetryAfterMs(response),\n });\n }\n if (status === 503) {\n return new ServiceUnavailableError(message, { code, status, requestId, details });\n }\n\n return new RunApiError(message, { code, status, requestId, details });\n}\n","import { AuthenticationError } from './errors';\nimport type { ClientOptions } from './types';\n\nconst ENV_VAR_NAME = 'RUNAPI_API_KEY';\n\nfunction readApiKeyFromEnv(): string | undefined {\n if (typeof process === 'undefined' || !process.env) {\n return undefined;\n }\n const trimmed = process.env[ENV_VAR_NAME]?.trim();\n return trimmed ? trimmed : undefined;\n}\n\n/**\n * Resolve the API key from explicit options or the `RUNAPI_API_KEY` environment\n * variable. Throws `AuthenticationError` when neither is provided.\n */\nexport function resolveApiKey(options: ClientOptions): string {\n const explicit = options.apiKey?.trim();\n const apiKey = explicit || readApiKeyFromEnv();\n if (!apiKey) {\n throw new AuthenticationError(\n `API key is required. Pass \\`apiKey\\` or set the \\`${ENV_VAR_NAME}\\` environment variable.`\n );\n }\n return apiKey;\n}\n","import { resolveApiKey } from './auth';\nimport {\n errorFromResponse,\n NetworkError,\n RunApiError,\n TimeoutError,\n} from './errors';\nimport {\n getRetryDelayMs,\n isIdempotentMethod,\n isRetryableStatus,\n parseRetryAfterMs,\n} from './retry';\nimport type { ClientOptions, HttpMethod, QueryParams, RequestOptions } from './types';\nimport {\n DEFAULT_BASE_URL,\n RETRY_CONFIG,\n SDK_USER_AGENT,\n TIMEOUTS,\n} from './constants';\n\nexport interface HttpRequestOptions extends RequestOptions {\n query?: QueryParams;\n body?: unknown;\n}\n\nexport interface HttpClient {\n request<T>(\n method: HttpMethod,\n path: string,\n options?: HttpRequestOptions\n ): Promise<T>;\n /**\n * PUT bytes straight to an absolute upload URL with the exact headers issued\n * for it. Skips the base URL, auth, and retries — the URL is single-use and\n * pre-authorized, and the body is not safe to replay.\n */\n upload(\n url: string,\n options: { headers: Record<string, string>; body: BodyInit; timeoutMs?: number; signal?: AbortSignal }\n ): Promise<void>;\n}\n\nfunction buildUrl(baseUrl: string, path: string, query?: QueryParams): string {\n const normalizedBase = baseUrl.replace(/\\/+$/, '');\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n const url = new URL(`${normalizedBase}${normalizedPath}`);\n\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null) {\n continue;\n }\n url.searchParams.set(key, String(value));\n }\n }\n\n return url.toString();\n}\n\nfunction mergeHeaders(\n base: Record<string, string>,\n extra?: Record<string, string>\n): Record<string, string> {\n return { ...base, ...(extra || {}) };\n}\n\nfunction hasHeader(headers: Record<string, string>, name: string): boolean {\n const target = name.toLowerCase();\n return Object.keys(headers).some((key) => key.toLowerCase() === target);\n}\n\nfunction isFormData(body: unknown): body is FormData {\n return typeof FormData !== 'undefined' && body instanceof FormData;\n}\n\nfunction prepareBody(body: unknown, headers: Record<string, string>): BodyInit | undefined {\n if (body === undefined || body === null) {\n return undefined;\n }\n\n if (isFormData(body) || body instanceof URLSearchParams) {\n return body as BodyInit;\n }\n\n if (typeof body === 'string' || body instanceof Blob || body instanceof ArrayBuffer) {\n return body as BodyInit;\n }\n\n if (!hasHeader(headers, 'content-type')) {\n headers['content-type'] = 'application/json';\n }\n\n return JSON.stringify(body);\n}\n\nasync function parseResponseBody(response: Response): Promise<{\n text: string | null;\n json: unknown;\n}> {\n const text = await response.text();\n if (!text) {\n return { text: null, json: undefined };\n }\n\n try {\n return { text, json: JSON.parse(text) };\n } catch {\n return { text, json: undefined };\n }\n}\n\nfunction createAbortController(\n timeoutMs: number,\n signal?: AbortSignal\n): { controller: AbortController; cleanup: () => void; timedOut: () => boolean } {\n const controller = new AbortController();\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let didTimeOut = false;\n\n if (signal) {\n if (signal.aborted) {\n controller.abort();\n } else {\n signal.addEventListener(\n 'abort',\n () => {\n controller.abort();\n },\n { once: true }\n );\n }\n }\n\n if (timeoutMs > 0) {\n timeoutId = setTimeout(() => {\n didTimeOut = true;\n controller.abort();\n }, timeoutMs);\n }\n\n return {\n controller,\n cleanup: () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n },\n timedOut: () => didTimeOut,\n };\n}\n\nfunction shouldRetryRequest(method: HttpMethod, status: number | undefined): boolean {\n if (status === undefined) {\n return false;\n }\n\n if (!isRetryableStatus(status)) {\n return false;\n }\n\n if (isIdempotentMethod(method)) {\n return true;\n }\n\n return false;\n}\n\nexport function createHttpClient(options: ClientOptions): HttpClient {\n const apiKey = resolveApiKey(options);\n const baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n const clientTimeoutMs = options.timeoutMs;\n const maxRetries = options.maxRetries ?? RETRY_CONFIG.MAX_RETRIES;\n const retryBaseDelayMs = options.retryBaseDelayMs ?? RETRY_CONFIG.BASE_DELAY;\n const retryMaxDelayMs = options.retryMaxDelayMs ?? RETRY_CONFIG.MAX_DELAY;\n const fetchImpl = options.fetch ?? fetch;\n const clientFetchOptions = options.fetchOptions ?? {};\n\n return {\n async request<T>(\n method: HttpMethod,\n path: string,\n requestOptions: HttpRequestOptions = {}\n ) {\n const url = buildUrl(baseUrl, path, requestOptions.query);\n const headers = mergeHeaders(\n {\n accept: 'application/json',\n authorization: `Bearer ${apiKey}`,\n 'user-agent': SDK_USER_AGENT,\n },\n requestOptions.headers\n );\n\n const body = prepareBody(requestOptions.body, headers);\n const requestTimeoutMs = requestOptions.timeoutMs ?? clientTimeoutMs ?? TIMEOUTS.HTTP_REQUEST;\n const requestMaxRetries = requestOptions.maxRetries ?? maxRetries;\n\n for (let attempt = 0; attempt <= requestMaxRetries; attempt += 1) {\n const { controller, cleanup, timedOut } = createAbortController(\n requestTimeoutMs,\n requestOptions.signal\n );\n\n try {\n const response = await fetchImpl(url, {\n ...clientFetchOptions,\n ...(requestOptions.fetchOptions ?? {}),\n method,\n headers,\n body,\n signal: controller.signal,\n });\n\n cleanup();\n\n const { text, json } = await parseResponseBody(response);\n\n if (!response.ok) {\n if (\n attempt < requestMaxRetries &&\n shouldRetryRequest(method, response.status)\n ) {\n const retryAfterMs = parseRetryAfterMs(response);\n const delayMs =\n retryAfterMs ??\n getRetryDelayMs(attempt, retryBaseDelayMs, retryMaxDelayMs);\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n continue;\n }\n\n throw errorFromResponse(response, text, json);\n }\n\n return (json ?? text) as T;\n } catch (error) {\n cleanup();\n\n if (timedOut()) {\n if (attempt < requestMaxRetries && isIdempotentMethod(method)) {\n const delayMs = getRetryDelayMs(\n attempt,\n retryBaseDelayMs,\n retryMaxDelayMs\n );\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n continue;\n }\n\n throw new TimeoutError('Request timed out');\n }\n\n if (requestOptions.signal?.aborted) {\n throw new RunApiError('Request aborted', { cause: error as Error });\n }\n\n if (error instanceof RunApiError) {\n throw error;\n }\n\n if (attempt < requestMaxRetries && isIdempotentMethod(method)) {\n const delayMs = getRetryDelayMs(\n attempt,\n retryBaseDelayMs,\n retryMaxDelayMs\n );\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n continue;\n }\n\n throw new NetworkError('Network error', { cause: error as Error });\n }\n }\n\n // Unreachable at runtime, but required for TypeScript return type inference\n throw new NetworkError('Network error');\n },\n\n async upload(url, uploadOptions) {\n const timeoutMs = uploadOptions.timeoutMs ?? clientTimeoutMs ?? TIMEOUTS.HTTP_REQUEST;\n const { controller, cleanup, timedOut } = createAbortController(timeoutMs, uploadOptions.signal);\n\n try {\n const response = await fetchImpl(url, {\n ...clientFetchOptions,\n method: 'PUT',\n headers: uploadOptions.headers,\n body: uploadOptions.body,\n signal: controller.signal,\n });\n cleanup();\n\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new RunApiError(`Direct upload failed with status ${response.status}${text ? `: ${text}` : ''}`);\n }\n } catch (error) {\n cleanup();\n if (timedOut()) {\n throw new TimeoutError('Direct upload timed out');\n }\n if (error instanceof RunApiError) {\n throw error;\n }\n throw new NetworkError('Direct upload network error', { cause: error as Error });\n }\n },\n };\n}\n","export function compactParams<T extends object>(params: T): Partial<T> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined || value === null) continue;\n if (typeof value === 'string' && value.trim() === '') continue;\n result[key] = value;\n }\n return result as Partial<T>;\n}\n","import { ValidationError } from './errors';\n\n/** One action entry from a package's generated contract. */\nexport interface ActionSchema {\n models?: readonly string[];\n rules?: readonly Record<string, any>[];\n fields_by_model?: Record<string, Record<string, any>>;\n}\n\ntype Params = Record<string, unknown>;\n\n/**\n * Validates request params against a generated action schema: model\n * membership, then declared cross-field rules, then per-field\n * required/enum/integer/min/max/length. A missing schema is a no-op.\n */\nexport function validateParams(schema: ActionSchema | undefined, params: Params): void {\n if (!schema) return;\n\n const model = params['model'];\n const models = schema.models ?? [];\n let fields: Record<string, any>;\n if (models.length === 0) {\n fields = schema.fields_by_model?.['_'] ?? {};\n } else {\n if (typeof model !== 'string' || !models.includes(model)) {\n const sorted = [...models].sort();\n throw new ValidationError(`model must be one of: ${sorted.join(', ')}`);\n }\n\n fields = schema.fields_by_model?.[model] ?? {};\n }\n\n const rules = schema.rules;\n if (Array.isArray(rules)) {\n for (const rule of rules) enforceContractRule(params, rule);\n }\n\n const keys = Object.keys(fields).sort();\n for (const field of keys) {\n validateSchemaField(params, field, fields[field]);\n }\n}\n\nfunction validateSchemaField(params: Params, field: string, rules: Record<string, any>): void {\n const present = fieldPresent(params, field);\n if (rules.required && !present) {\n throw new ValidationError(`${field} is required`);\n }\n if (!present) return;\n\n const value = params[field];\n if (rules.enum !== undefined && !enumValueAllowed(rules.enum, value)) {\n throw new ValidationError(`${field} must be one of: ${formatEnumValues(rules.enum)}`);\n }\n\n if (rules.type === 'integer') {\n validateSchemaInteger(field, value, rules);\n }\n\n if ('min' in rules || 'max' in rules) {\n validateSchemaRange(field, value, rules);\n }\n}\n\n// Mirrors GatewayEntry#validate_schema_integer!: a type: integer field rejects\n// non-integer numbers (e.g. 11.5), which min/max alone admit. JS has no integer\n// type, so whole-valued floats count — they serialize to an integer on the wire.\nfunction validateSchemaInteger(field: string, value: unknown, rules: Record<string, any>): void {\n if (typeof value === 'number' && Number.isInteger(value)) return;\n const detail =\n rules.min != null && rules.max != null\n ? ` between ${formatValue(rules.min)} and ${formatValue(rules.max)}`\n : '';\n throw new ValidationError(`${field} must be an integer${detail}`);\n}\n\nfunction validateSchemaRange(field: string, value: unknown, rules: Record<string, any>): void {\n let measured: number;\n let unit: string | null;\n if (rules.length) {\n measured = [...String(value)].length;\n unit = 'characters';\n } else {\n if (typeof value !== 'number') {\n throw new ValidationError(`${field} must be a number`);\n }\n measured = value;\n unit = null;\n }\n\n const min = rules.min;\n const max = rules.max;\n if ((min == null || measured >= min) && (max == null || measured <= max)) return;\n throw new ValidationError(rangeMessage(field, min, max, unit));\n}\n\nfunction rangeMessage(field: string, min: unknown, max: unknown, unit: string | null): string {\n const suffix = unit ? ` ${unit}` : '';\n if (min != null && max != null) {\n return `${field} must be between ${formatValue(min)} and ${formatValue(max)}${suffix}`;\n }\n if (min != null) {\n return `${field} must be at least ${formatValue(min)}${suffix}`;\n }\n return `${field} must be at most ${formatValue(max)}${suffix}`;\n}\n\nfunction enumValueAllowed(enumValues: readonly unknown[], value: unknown): boolean {\n const valueIsNum = typeof value === 'number';\n for (const allowed of enumValues) {\n const allowedIsNum = typeof allowed === 'number';\n if (allowedIsNum) {\n if (valueIsNum && value === allowed) return true;\n } else if (valueIsNum) {\n // allowed non-numeric while value is numeric never matches.\n } else if (String(allowed) === String(value)) {\n return true;\n }\n }\n return false;\n}\n\nfunction enforceContractRule(params: Params, rule: Record<string, any>): void {\n const conditions: Record<string, unknown> = rule.when ?? {};\n const keys = Object.keys(conditions);\n for (const key of keys) {\n if (!ruleConditionMet(params, key, conditions[key])) return;\n }\n\n const context = keys.map((key) => `${key} is ${formatValue(conditions[key])}`).join(' and ');\n for (const field of rule.required ?? []) {\n if (!fieldPresent(params, field)) {\n throw new ValidationError(`${field} is required when ${context}`);\n }\n }\n for (const field of rule.forbidden ?? []) {\n if (fieldPresent(params, field)) {\n throw new ValidationError(`${field} is not allowed when ${context}`);\n }\n }\n}\n\nfunction ruleConditionMet(params: Params, field: string, value: unknown): boolean {\n if (!(field in params)) return false;\n return String(params[field]) === String(value);\n}\n\nfunction fieldPresent(params: Params, field: string): boolean {\n if (!(field in params)) return false;\n const value = params[field];\n if (value === false) return true;\n if (Array.isArray(value)) return value.some(presentValue);\n return presentValue(value);\n}\n\nfunction presentValue(value: unknown): boolean {\n if (value === null || value === undefined || value === false) return false;\n if (value === true) return true;\n if (typeof value === 'string') return value.trim() !== '';\n if (Array.isArray(value)) return value.length > 0;\n if (typeof value === 'object') return Object.keys(value).length > 0;\n return true;\n}\n\nfunction formatValue(value: unknown): string {\n return typeof value === 'string' ? value : String(value);\n}\n\n// JS collapses float literals (0.0 -> 0), losing the float type the other SDKs\n// keep. When an enum has a fractional member it is a float enum, so render its\n// whole-number members with a trailing .0 to match the gateway/Go/Ruby/Python\n// message text (e.g. \"0.0, 0.5, 1.0\", not \"0, 0.5, 1\").\nfunction formatEnumValues(values: readonly unknown[]): string {\n const floatEnum = values.some((v) => typeof v === 'number' && !Number.isInteger(v));\n return values\n .map((v) => (floatEnum && typeof v === 'number' ? formatFloat(v) : formatValue(v)))\n .join(', ');\n}\n\nfunction formatFloat(value: number): string {\n const text = String(value);\n return /[.eE]/.test(text) ? text : `${text}.0`;\n}\n","// RFC 1321 MD5 over raw bytes, returning the Base64 of the 16-byte digest — the\n// value the upload target expects as the Content-MD5 header on a direct-upload\n// PUT. Web Crypto has no MD5, so direct upload needs this pure implementation to\n// run in browsers as well as Node.\n\nconst SHIFTS = [\n 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,\n 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,\n 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,\n 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21,\n];\n\nconst K = Array.from({ length: 64 }, (_v, i) =>\n Math.floor(Math.abs(Math.sin(i + 1)) * 4294967296),\n);\n\nfunction add32(a: number, b: number): number {\n return (a + b) & 0xffffffff;\n}\n\nfunction rotl(value: number, bits: number): number {\n return (value << bits) | (value >>> (32 - bits));\n}\n\nfunction md5Bytes(input: Uint8Array): Uint8Array {\n const withOne = input.length + 1;\n const totalLen = withOne + ((56 - (withOne % 64) + 64) % 64) + 8;\n const msg = new Uint8Array(totalLen);\n msg.set(input);\n msg[input.length] = 0x80;\n\n const view = new DataView(msg.buffer);\n const bitLen = input.length * 8;\n view.setUint32(totalLen - 8, bitLen >>> 0, true);\n view.setUint32(totalLen - 4, Math.floor(bitLen / 0x100000000) >>> 0, true);\n\n let a0 = 0x67452301;\n let b0 = 0xefcdab89;\n let c0 = 0x98badcfe;\n let d0 = 0x10325476;\n\n const m = new Int32Array(16);\n for (let offset = 0; offset < totalLen; offset += 64) {\n for (let j = 0; j < 16; j += 1) {\n m[j] = view.getUint32(offset + j * 4, true);\n }\n\n let a = a0;\n let b = b0;\n let c = c0;\n let d = d0;\n\n for (let i = 0; i < 64; i += 1) {\n let f: number;\n let g: number;\n if (i < 16) {\n f = (b & c) | (~b & d);\n g = i;\n } else if (i < 32) {\n f = (d & b) | (~d & c);\n g = (5 * i + 1) % 16;\n } else if (i < 48) {\n f = b ^ c ^ d;\n g = (3 * i + 5) % 16;\n } else {\n f = c ^ (b | ~d);\n g = (7 * i) % 16;\n }\n\n f = add32(add32(f, a), add32(K[i], m[g]));\n a = d;\n d = c;\n c = b;\n b = add32(b, rotl(f, SHIFTS[i]));\n }\n\n a0 = add32(a0, a);\n b0 = add32(b0, b);\n c0 = add32(c0, c);\n d0 = add32(d0, d);\n }\n\n const out = new Uint8Array(16);\n const outView = new DataView(out.buffer);\n outView.setUint32(0, a0 >>> 0, true);\n outView.setUint32(4, b0 >>> 0, true);\n outView.setUint32(8, c0 >>> 0, true);\n outView.setUint32(12, d0 >>> 0, true);\n return out;\n}\n\nconst BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n let out = '';\n for (let i = 0; i < bytes.length; i += 3) {\n const b0 = bytes[i];\n const b1 = i + 1 < bytes.length ? bytes[i + 1] : 0;\n const b2 = i + 2 < bytes.length ? bytes[i + 2] : 0;\n out += BASE64_CHARS[b0 >> 2];\n out += BASE64_CHARS[((b0 & 3) << 4) | (b1 >> 4)];\n out += i + 1 < bytes.length ? BASE64_CHARS[((b1 & 15) << 2) | (b2 >> 6)] : '=';\n out += i + 2 < bytes.length ? BASE64_CHARS[b2 & 63] : '=';\n }\n return out;\n}\n\nexport function md5Base64(bytes: Uint8Array): string {\n return bytesToBase64(md5Bytes(bytes));\n}\n","import type { HttpClient } from './http';\nimport type { RequestOptions } from './types';\nimport { compactParams } from './params';\nimport { md5Base64 } from './md5';\n\nconst ENDPOINT = '/api/v1/files';\nconst PREPARE_ENDPOINT = `${ENDPOINT}/prepare`;\nconst CONFIRM_ENDPOINT = `${ENDPOINT}/confirm`;\n\ninterface PrepareResponse {\n signed_id: string;\n upload_url: string;\n headers: Record<string, string>;\n}\n\nexport interface FileUploadResponse {\n file_name: string;\n url: string;\n size_bytes: number;\n mime_type: string;\n created_at: string;\n expires_at: string;\n}\n\nexport type FileSource =\n | { type: 'url'; url: string }\n | { type: 'base64'; data: string };\n\nexport type FileCreateParams =\n | {\n file: Blob;\n file_name?: string;\n source?: never;\n }\n | {\n source: FileSource;\n file_name?: string;\n file?: never;\n };\n\nexport class Files {\n constructor(private readonly http: HttpClient) {}\n\n async create(params: FileCreateParams, options?: RequestOptions): Promise<FileUploadResponse> {\n const rawParams = params as { file?: Blob; source?: FileSource; file_name?: string };\n const hasFile = Boolean(rawParams.file);\n const hasSource = Boolean(rawParams.source);\n if (Number(hasFile) + Number(hasSource) !== 1) {\n throw new Error('Exactly one source is required: file or source');\n }\n\n if (hasFile) {\n return this.uploadDirect(rawParams.file as Blob, params.file_name, options);\n }\n\n return this.http.request<FileUploadResponse>('POST', ENDPOINT, {\n body: compactParams(params),\n ...options,\n });\n }\n\n // Local files upload straight to storage: ask for a pre-authorized target,\n // PUT the bytes there (never through the API), then confirm. The caller still\n // sees a single create() call.\n private async uploadDirect(\n file: Blob,\n fileName: string | undefined,\n options?: RequestOptions,\n ): Promise<FileUploadResponse> {\n const bytes = new Uint8Array(await file.arrayBuffer());\n const filename = fileName ?? (file as { name?: string }).name ?? 'upload';\n const contentType = file.type || 'application/octet-stream';\n\n const prepared = await this.http.request<PrepareResponse>('POST', PREPARE_ENDPOINT, {\n body: {\n filename,\n byte_size: bytes.byteLength,\n checksum: md5Base64(bytes),\n content_type: contentType,\n },\n ...options,\n });\n\n await this.http.upload(prepared.upload_url, {\n headers: prepared.headers,\n body: bytes,\n timeoutMs: options?.timeoutMs,\n signal: options?.signal,\n });\n\n return this.http.request<FileUploadResponse>('POST', CONFIRM_ENDPOINT, {\n body: { signed_id: prepared.signed_id },\n ...options,\n });\n }\n}\n","import type { HttpClient } from './http';\nimport type { RequestOptions } from './types';\n\nconst INFO_ENDPOINT = '/api/v1/me';\nconst BALANCE_ENDPOINT = '/api/v1/me/balance';\n\nexport interface AccountInfoResponse {\n id: number;\n name: string;\n email: string;\n account: {\n id: number;\n name: string;\n };\n}\n\nexport interface AccountBalanceResponse {\n balance_cents: number;\n paid_balance_cents: number;\n bonus_balance_cents: number;\n spent_cents_today: number;\n spent_cents_total: number;\n}\n\nexport class Account {\n constructor(private readonly http: HttpClient) {}\n\n async info(options?: RequestOptions): Promise<AccountInfoResponse> {\n return this.http.request<AccountInfoResponse>('GET', INFO_ENDPOINT, { ...options });\n }\n\n async balance(options?: RequestOptions): Promise<AccountBalanceResponse> {\n return this.http.request<AccountBalanceResponse>('GET', BALANCE_ENDPOINT, { ...options });\n }\n}\n","import { createHttpClient, type HttpClient } from './http';\nimport { resolveApiKey } from './auth';\nimport type { ClientOptions } from './types';\nimport { Files } from './files';\nimport { Account } from './account';\n\n/**\n * Base class for every RunAPI client. Resolves the API key, builds the shared\n * HTTP client, and exposes the Universal Resources (file upload, account) that\n * are available on any client regardless of which model package was imported.\n *\n * Provider clients extend this and build their model resources from `this.http`.\n */\nexport class BaseClient {\n /** Temporary file upload operations. */\n public readonly files: Files;\n /** Account info and balance operations. */\n public readonly account: Account;\n\n protected readonly http: HttpClient;\n private readonly apiKey: string;\n\n constructor(options: ClientOptions = {}) {\n this.apiKey = resolveApiKey(options);\n this.http = createHttpClient(options);\n this.files = new Files(this.http);\n this.account = new Account(this.http);\n }\n\n getApiKey() {\n return this.apiKey;\n }\n}\n"],"mappings":"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","names":[]} | ||
| {"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/retry.ts","../src/errors.ts","../src/auth.ts","../src/http.ts","../src/params.ts","../src/validate.ts","../src/md5.ts","../src/files.ts","../src/account.ts","../src/base-client.ts"],"sourcesContent":["// Types\nexport type {\n HttpMethod,\n QueryParams,\n ClientOptions,\n RequestOptions,\n PollingOptions,\n TaskStatus,\n AsyncTaskStatus,\n TaskResponse,\n} from './types';\n\n// Constants\nexport { TIMEOUTS, RETRY_CONFIG, DEFAULT_BASE_URL, SDK_USER_AGENT } from './constants';\n\n// Errors\nexport {\n RunApiError,\n AuthenticationError,\n RateLimitError,\n InsufficientCreditsError,\n NotFoundError,\n ValidationError,\n ServiceUnavailableError,\n NetworkError,\n TimeoutError,\n TaskTimeoutError,\n TaskFailedError,\n errorFromResponse,\n} from './errors';\nexport type { RunApiErrorOptions } from './errors';\n\n// Auth\nexport { resolveApiKey } from './auth';\n\n// HTTP Client\nexport { createHttpClient } from './http';\nexport type { HttpClient, HttpRequestOptions } from './http';\n\n// Retry (高级用户可用)\nexport {\n getRetryDelayMs,\n isRetryableStatus,\n isIdempotentMethod,\n parseRetryAfterMs,\n} from './retry';\nexport type { RetryOptions } from './retry';\n\n// Params\nexport { compactParams } from './params';\n\n// Contract validation\nexport { validateParams } from './validate';\nexport type { ActionSchema } from './validate';\n\n// Files\nexport { Files } from './files';\nexport type { FileCreateParams, FileSource, FileUploadResponse } from './files';\n\n// Account\nexport { Account } from './account';\nexport type { AccountInfoResponse, AccountBalanceResponse } from './account';\n\n// Base client\nexport { BaseClient } from './base-client';\n\n// Version\nexport const version = '0.1.0';\n\n// Note: pollUntilComplete 不从主入口导出,避免 PollingOptions 类型暴露\n// 各 API 包(suno/veo-3-1 等)通过 '@runapi.ai/core/internal' 导入\n","/**\n * Default timeout constants for SDK operations.\n * All values are in milliseconds.\n */\nexport const TIMEOUTS = {\n /**\n * Default HTTP request timeout (15 minutes).\n * AI generation APIs can take significant time to complete.\n */\n HTTP_REQUEST: 900000,\n\n /**\n * Default polling timeout (15 minutes).\n * Matches HTTP_REQUEST to allow long-running tasks to complete.\n */\n POLLING_MAX_WAIT: 900000,\n\n /**\n * Default polling interval (2 seconds).\n * How often to check task status during polling.\n */\n POLLING_INTERVAL: 2000,\n} as const;\n\n/**\n * Default retry configuration for HTTP requests.\n */\nexport const RETRY_CONFIG = {\n /**\n * Maximum number of retry attempts.\n */\n MAX_RETRIES: 2,\n\n /**\n * Base delay between retries (500ms).\n * Actual delay uses exponential backoff.\n */\n BASE_DELAY: 500,\n\n /**\n * Maximum delay between retries (5 seconds).\n * Caps the exponential backoff.\n */\n MAX_DELAY: 5000,\n} as const;\n\n/**\n * Default base URL for RunAPI services.\n */\nexport const DEFAULT_BASE_URL = 'https://runapi.ai';\n\n/**\n * SDK user agent string.\n */\nexport const SDK_USER_AGENT = 'runapi-sdk-js';\n","export interface RetryOptions {\n maxRetries: number;\n baseDelayMs: number;\n maxDelayMs: number;\n}\n\nexport function getRetryDelayMs(\n attempt: number,\n baseDelayMs: number,\n maxDelayMs: number\n): number {\n const exponential = baseDelayMs * Math.pow(2, attempt);\n const capped = Math.min(exponential, maxDelayMs);\n const jitter = Math.random() * capped * 0.5;\n return Math.min(maxDelayMs, capped + jitter);\n}\n\nexport function isRetryableStatus(status: number): boolean {\n return status === 429 || status >= 500;\n}\n\nexport function isIdempotentMethod(method: string): boolean {\n return ['GET', 'HEAD', 'PUT', 'DELETE', 'OPTIONS'].includes(method);\n}\n\nexport function parseRetryAfterMs(response: Response): number | undefined {\n const retryAfter = response.headers.get('retry-after');\n if (!retryAfter) {\n return undefined;\n }\n\n const numeric = Number(retryAfter);\n if (!Number.isNaN(numeric)) {\n return numeric * 1000;\n }\n\n const dateMs = Date.parse(retryAfter);\n if (!Number.isNaN(dateMs)) {\n return Math.max(0, dateMs - Date.now());\n }\n\n return undefined;\n}\n","import { parseRetryAfterMs } from './retry';\n\n/** Options for constructing RunApiError instances. */\nexport interface RunApiErrorOptions extends ErrorOptions {\n /** Explicit machine-readable reason. */\n code?: string;\n /** HTTP status code. */\n status?: number;\n /** Request ID from `X-Request-ID` header. */\n requestId?: string;\n /** Additional error details from response body. */\n details?: unknown;\n}\n\n/**\n * Base error class for all RunAPI SDK errors.\n * Includes HTTP status, request ID, and response details.\n */\nexport class RunApiError extends Error {\n /** Explicit machine-readable reason when one was provided. */\n code?: string;\n /** HTTP status code if available. */\n status?: number;\n /** Request ID from response headers. */\n requestId?: string;\n /** Parsed response body or error details. */\n details?: unknown;\n\n constructor(message: string, options: RunApiErrorOptions = {}) {\n super(message, options);\n this.name = 'RunApiError';\n this.code = options.code;\n this.status = options.status;\n this.requestId = options.requestId;\n this.details = options.details;\n }\n}\n\n/** Thrown when API key is missing or invalid (HTTP 401). */\nexport class AuthenticationError extends RunApiError {\n constructor(message: string, options: RunApiErrorOptions = {}) {\n super(message, { code: 'authentication', ...options });\n this.name = 'AuthenticationError';\n }\n}\n\n/** Thrown when rate limit is exceeded (HTTP 429). Includes retry-after delay. */\nexport class RateLimitError extends RunApiError {\n /** Suggested retry delay in milliseconds from `Retry-After` header. */\n retryAfterMs?: number;\n\n constructor(\n message: string,\n options: RunApiErrorOptions & { retryAfterMs?: number } = {}\n ) {\n super(message, { code: 'rate_limit', ...options });\n this.name = 'RateLimitError';\n this.retryAfterMs = options.retryAfterMs;\n }\n}\n\n/** Thrown when account has insufficient credits (HTTP 402). */\nexport class InsufficientCreditsError extends RunApiError {\n constructor(message: string, options: RunApiErrorOptions = {}) {\n super(message, { code: 'insufficient_credits', ...options });\n this.name = 'InsufficientCreditsError';\n }\n}\n\n/** Thrown when requested resource does not exist (HTTP 404). */\nexport class NotFoundError extends RunApiError {\n constructor(message: string, options: RunApiErrorOptions = {}) {\n super(message, { code: 'not_found', ...options });\n this.name = 'NotFoundError';\n }\n}\n\n/** Thrown when request validation fails (HTTP 400, 422). */\nexport class ValidationError extends RunApiError {\n constructor(message: string, options: RunApiErrorOptions = {}) {\n super(message, { code: 'validation', ...options });\n this.name = 'ValidationError';\n }\n}\n\n/** Thrown when a request conflicts with current resource state (HTTP 409). */\nexport class ConflictError extends RunApiError {\n constructor(message: string, options: RunApiErrorOptions = {}) {\n super(message, { code: 'conflict', ...options });\n this.name = 'ConflictError';\n }\n}\n\n/** Thrown when service is temporarily unavailable (HTTP 503). */\nexport class ServiceUnavailableError extends RunApiError {\n constructor(message: string, options: RunApiErrorOptions = {}) {\n super(message, { code: 'service_unavailable', ...options });\n this.name = 'ServiceUnavailableError';\n }\n}\n\n/** Thrown when network connection fails or request cannot be sent. */\nexport class NetworkError extends RunApiError {\n constructor(message: string, options: RunApiErrorOptions = {}) {\n super(message, { code: 'network', ...options });\n this.name = 'NetworkError';\n }\n}\n\n/** Thrown when HTTP request exceeds configured timeout. */\nexport class TimeoutError extends RunApiError {\n constructor(message: string, options: RunApiErrorOptions = {}) {\n super(message, { code: 'timeout', ...options });\n this.name = 'TimeoutError';\n }\n}\n\n/** Thrown when polling for task completion exceeds maximum wait time. */\nexport class TaskTimeoutError extends RunApiError {\n constructor(message: string, options: RunApiErrorOptions = {}) {\n super(message, { code: 'task_timeout', ...options });\n this.name = 'TaskTimeoutError';\n }\n}\n\n/** Thrown when async task fails during processing. */\nexport class TaskFailedError extends RunApiError {\n constructor(message: string, options: RunApiErrorOptions = {}) {\n super(message, { code: 'task_failed', ...options });\n this.name = 'TaskFailedError';\n }\n}\n\nconst DEFAULT_ERROR_MESSAGE = 'Request failed';\n\n// Detect HTML error pages from proxies/gateways to avoid leaking raw markup as message.\nconst HTML_MARKER = /<!doctype|<html/i;\n\nfunction extractMessageFromUnknown(value: unknown): string | undefined {\n if (typeof value === 'string' && value.trim()) {\n return value.trim();\n }\n\n if (value && typeof value === 'object') {\n const maybeMessage = (value as { message?: unknown }).message;\n if (typeof maybeMessage === 'string' && maybeMessage.trim()) {\n return maybeMessage.trim();\n }\n const maybeDetail = (value as { detail?: unknown }).detail;\n if (typeof maybeDetail === 'string' && maybeDetail.trim()) {\n return maybeDetail.trim();\n }\n }\n\n return undefined;\n}\n\nfunction extractErrorMessage(body: unknown): string | undefined {\n if (typeof body === 'string') {\n if (!body.trim()) {\n return undefined;\n }\n if (HTML_MARKER.test(body)) {\n return undefined;\n }\n return body.trim();\n }\n\n if (!body || typeof body !== 'object') {\n return undefined;\n }\n\n const maybeError = (body as { error?: unknown }).error;\n const errorMessage = extractMessageFromUnknown(maybeError);\n if (errorMessage) {\n return errorMessage;\n }\n\n const maybeErrors = (body as { errors?: unknown }).errors;\n if (Array.isArray(maybeErrors) && maybeErrors.length > 0) {\n const firstString = maybeErrors.find((item) => typeof item === 'string');\n if (typeof firstString === 'string') {\n return firstString;\n }\n const firstObject = maybeErrors.find(\n (item) => item && typeof item === 'object'\n );\n const objectMessage = extractMessageFromUnknown(firstObject);\n if (objectMessage) {\n return objectMessage;\n }\n }\n\n const maybeMessage = (body as { message?: unknown }).message;\n if (typeof maybeMessage === 'string' && maybeMessage.trim()) {\n return maybeMessage.trim();\n }\n\n const maybeDetail = (body as { detail?: unknown }).detail;\n if (typeof maybeDetail === 'string' && maybeDetail.trim()) {\n return maybeDetail.trim();\n }\n\n const maybeErrorMessage = (body as { errorMessage?: unknown }).errorMessage;\n if (typeof maybeErrorMessage === 'string' && maybeErrorMessage.trim()) {\n return maybeErrorMessage.trim();\n }\n\n const maybeMsg = (body as { msg?: unknown }).msg;\n if (typeof maybeMsg === 'string' && maybeMsg.trim()) {\n return maybeMsg.trim();\n }\n\n return undefined;\n}\n\nfunction extractErrorCode(body: unknown): string | undefined {\n if (!body || typeof body !== 'object') {\n return undefined;\n }\n\n const error = (body as { error?: unknown }).error;\n if (!error || typeof error !== 'object') {\n return undefined;\n }\n\n const code = (error as { code?: unknown }).code;\n return typeof code === 'string' && code.trim() ? code : undefined;\n}\n\nfunction defaultMessageForStatus(status: number): string {\n switch (status) {\n case 400:\n return 'Bad request';\n case 401:\n return 'Unauthorized';\n case 402:\n return 'Insufficient credits';\n case 404:\n return 'Not found';\n case 409:\n return 'Conflict';\n case 408:\n return 'Request timeout';\n case 413:\n return 'Payload too large';\n case 415:\n return 'Unsupported media type';\n case 422:\n return 'Validation failed';\n case 429:\n return 'Too many requests';\n case 503:\n return 'Service unavailable';\n default:\n if (status >= 500) {\n return 'Server error';\n }\n return DEFAULT_ERROR_MESSAGE;\n }\n}\n\n/**\n * Constructs appropriate error class from HTTP response.\n * Maps status codes to specific error types and extracts error messages.\n *\n * @param response - HTTP Response object\n * @param bodyText - Response body as text\n * @param bodyJson - Parsed JSON body if available\n * @returns Specific error instance based on status code\n */\nexport function errorFromResponse(\n response: Response,\n bodyText: string | null,\n bodyJson?: unknown\n): RunApiError {\n const status = response.status;\n const requestId = response.headers.get('x-request-id') || undefined;\n const messageFromBody =\n extractErrorMessage(bodyJson) || extractErrorMessage(bodyText);\n const message = messageFromBody || defaultMessageForStatus(status);\n const details = bodyJson ?? bodyText ?? undefined;\n const code = extractErrorCode(bodyJson);\n\n if (status === 401) {\n return new AuthenticationError(message, { code, status, requestId, details });\n }\n if (status === 402) {\n return new InsufficientCreditsError(message, { code, status, requestId, details });\n }\n if (status === 404) {\n return new NotFoundError(message, { code, status, requestId, details });\n }\n if (status === 422 || status === 400) {\n return new ValidationError(message, { code, status, requestId, details });\n }\n if (status === 409) {\n return new ConflictError(message, { code, status, requestId, details });\n }\n if (status === 429) {\n return new RateLimitError(message, {\n status,\n code,\n requestId,\n details,\n retryAfterMs: parseRetryAfterMs(response),\n });\n }\n if (status === 503) {\n return new ServiceUnavailableError(message, { code, status, requestId, details });\n }\n\n return new RunApiError(message, { code, status, requestId, details });\n}\n","import { AuthenticationError } from './errors';\nimport type { ClientOptions } from './types';\n\nconst ENV_VAR_NAME = 'RUNAPI_API_KEY';\n\nfunction readApiKeyFromEnv(): string | undefined {\n if (typeof process === 'undefined' || !process.env) {\n return undefined;\n }\n const trimmed = process.env[ENV_VAR_NAME]?.trim();\n return trimmed ? trimmed : undefined;\n}\n\n/**\n * Resolve the API key from explicit options or the `RUNAPI_API_KEY` environment\n * variable. Throws `AuthenticationError` when neither is provided.\n */\nexport function resolveApiKey(options: ClientOptions): string {\n const explicit = options.apiKey?.trim();\n const apiKey = explicit || readApiKeyFromEnv();\n if (!apiKey) {\n throw new AuthenticationError(\n `API key is required. Pass \\`apiKey\\` or set the \\`${ENV_VAR_NAME}\\` environment variable.`\n );\n }\n return apiKey;\n}\n","import { resolveApiKey } from './auth';\nimport {\n errorFromResponse,\n NetworkError,\n RunApiError,\n TimeoutError,\n} from './errors';\nimport {\n getRetryDelayMs,\n isIdempotentMethod,\n isRetryableStatus,\n parseRetryAfterMs,\n} from './retry';\nimport type { ClientOptions, HttpMethod, QueryParams, RequestOptions } from './types';\nimport {\n DEFAULT_BASE_URL,\n RETRY_CONFIG,\n SDK_USER_AGENT,\n TIMEOUTS,\n} from './constants';\n\nexport interface HttpRequestOptions extends RequestOptions {\n query?: QueryParams;\n body?: unknown;\n}\n\nexport interface HttpClient {\n request<T>(\n method: HttpMethod,\n path: string,\n options?: HttpRequestOptions\n ): Promise<T>;\n /**\n * PUT bytes straight to an absolute upload URL with the exact headers issued\n * for it. Skips the base URL, auth, and retries — the URL is single-use and\n * pre-authorized, and the body is not safe to replay.\n */\n upload(\n url: string,\n options: { headers: Record<string, string>; body: BodyInit; timeoutMs?: number; signal?: AbortSignal }\n ): Promise<void>;\n}\n\nfunction buildUrl(baseUrl: string, path: string, query?: QueryParams): string {\n const normalizedBase = baseUrl.replace(/\\/+$/, '');\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n const url = new URL(`${normalizedBase}${normalizedPath}`);\n\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null) {\n continue;\n }\n url.searchParams.set(key, String(value));\n }\n }\n\n return url.toString();\n}\n\nfunction mergeHeaders(\n base: Record<string, string>,\n extra?: Record<string, string>\n): Record<string, string> {\n return { ...base, ...(extra || {}) };\n}\n\nfunction hasHeader(headers: Record<string, string>, name: string): boolean {\n const target = name.toLowerCase();\n return Object.keys(headers).some((key) => key.toLowerCase() === target);\n}\n\nfunction isFormData(body: unknown): body is FormData {\n return typeof FormData !== 'undefined' && body instanceof FormData;\n}\n\nfunction prepareBody(body: unknown, headers: Record<string, string>): BodyInit | undefined {\n if (body === undefined || body === null) {\n return undefined;\n }\n\n if (isFormData(body) || body instanceof URLSearchParams) {\n return body as BodyInit;\n }\n\n if (typeof body === 'string' || body instanceof Blob || body instanceof ArrayBuffer) {\n return body as BodyInit;\n }\n\n if (!hasHeader(headers, 'content-type')) {\n headers['content-type'] = 'application/json';\n }\n\n return JSON.stringify(body);\n}\n\nasync function parseResponseBody(response: Response): Promise<{\n text: string | null;\n json: unknown;\n}> {\n const text = await response.text();\n if (!text) {\n return { text: null, json: undefined };\n }\n\n try {\n return { text, json: JSON.parse(text) };\n } catch {\n return { text, json: undefined };\n }\n}\n\nfunction createAbortController(\n timeoutMs: number,\n signal?: AbortSignal\n): { controller: AbortController; cleanup: () => void; timedOut: () => boolean } {\n const controller = new AbortController();\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let didTimeOut = false;\n\n if (signal) {\n if (signal.aborted) {\n controller.abort();\n } else {\n signal.addEventListener(\n 'abort',\n () => {\n controller.abort();\n },\n { once: true }\n );\n }\n }\n\n if (timeoutMs > 0) {\n timeoutId = setTimeout(() => {\n didTimeOut = true;\n controller.abort();\n }, timeoutMs);\n }\n\n return {\n controller,\n cleanup: () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n },\n timedOut: () => didTimeOut,\n };\n}\n\nfunction shouldRetryRequest(method: HttpMethod, status: number | undefined): boolean {\n if (status === undefined) {\n return false;\n }\n\n if (!isRetryableStatus(status)) {\n return false;\n }\n\n if (isIdempotentMethod(method)) {\n return true;\n }\n\n return false;\n}\n\nexport function createHttpClient(options: ClientOptions): HttpClient {\n const apiKey = resolveApiKey(options);\n const baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n const clientTimeoutMs = options.timeoutMs;\n const maxRetries = options.maxRetries ?? RETRY_CONFIG.MAX_RETRIES;\n const retryBaseDelayMs = options.retryBaseDelayMs ?? RETRY_CONFIG.BASE_DELAY;\n const retryMaxDelayMs = options.retryMaxDelayMs ?? RETRY_CONFIG.MAX_DELAY;\n const fetchImpl = options.fetch ?? fetch;\n const clientFetchOptions = options.fetchOptions ?? {};\n\n return {\n async request<T>(\n method: HttpMethod,\n path: string,\n requestOptions: HttpRequestOptions = {}\n ) {\n const url = buildUrl(baseUrl, path, requestOptions.query);\n const headers = mergeHeaders(\n {\n accept: 'application/json',\n authorization: `Bearer ${apiKey}`,\n 'user-agent': SDK_USER_AGENT,\n },\n requestOptions.headers\n );\n\n const body = prepareBody(requestOptions.body, headers);\n const requestTimeoutMs = requestOptions.timeoutMs ?? clientTimeoutMs ?? TIMEOUTS.HTTP_REQUEST;\n const requestMaxRetries = requestOptions.maxRetries ?? maxRetries;\n\n for (let attempt = 0; attempt <= requestMaxRetries; attempt += 1) {\n const { controller, cleanup, timedOut } = createAbortController(\n requestTimeoutMs,\n requestOptions.signal\n );\n\n try {\n const response = await fetchImpl(url, {\n ...clientFetchOptions,\n ...(requestOptions.fetchOptions ?? {}),\n method,\n headers,\n body,\n signal: controller.signal,\n });\n\n cleanup();\n\n const { text, json } = await parseResponseBody(response);\n\n if (!response.ok) {\n if (\n attempt < requestMaxRetries &&\n shouldRetryRequest(method, response.status)\n ) {\n const retryAfterMs = parseRetryAfterMs(response);\n const delayMs =\n retryAfterMs ??\n getRetryDelayMs(attempt, retryBaseDelayMs, retryMaxDelayMs);\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n continue;\n }\n\n throw errorFromResponse(response, text, json);\n }\n\n return (json ?? text) as T;\n } catch (error) {\n cleanup();\n\n if (timedOut()) {\n if (attempt < requestMaxRetries && isIdempotentMethod(method)) {\n const delayMs = getRetryDelayMs(\n attempt,\n retryBaseDelayMs,\n retryMaxDelayMs\n );\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n continue;\n }\n\n throw new TimeoutError('Request timed out');\n }\n\n if (requestOptions.signal?.aborted) {\n throw new RunApiError('Request aborted', { cause: error as Error });\n }\n\n if (error instanceof RunApiError) {\n throw error;\n }\n\n if (attempt < requestMaxRetries && isIdempotentMethod(method)) {\n const delayMs = getRetryDelayMs(\n attempt,\n retryBaseDelayMs,\n retryMaxDelayMs\n );\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n continue;\n }\n\n throw new NetworkError('Network error', { cause: error as Error });\n }\n }\n\n // Unreachable at runtime, but required for TypeScript return type inference\n throw new NetworkError('Network error');\n },\n\n async upload(url, uploadOptions) {\n const timeoutMs = uploadOptions.timeoutMs ?? clientTimeoutMs ?? TIMEOUTS.HTTP_REQUEST;\n const { controller, cleanup, timedOut } = createAbortController(timeoutMs, uploadOptions.signal);\n\n try {\n const response = await fetchImpl(url, {\n ...clientFetchOptions,\n method: 'PUT',\n headers: uploadOptions.headers,\n body: uploadOptions.body,\n signal: controller.signal,\n });\n cleanup();\n\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new RunApiError(`Direct upload failed with status ${response.status}${text ? `: ${text}` : ''}`);\n }\n } catch (error) {\n cleanup();\n if (timedOut()) {\n throw new TimeoutError('Direct upload timed out');\n }\n if (error instanceof RunApiError) {\n throw error;\n }\n throw new NetworkError('Direct upload network error', { cause: error as Error });\n }\n },\n };\n}\n","export function compactParams<T extends object>(params: T): Partial<T> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined || value === null) continue;\n if (typeof value === 'string' && value.trim() === '') continue;\n result[key] = value;\n }\n return result as Partial<T>;\n}\n","import { ValidationError } from './errors';\n\n/** One action entry from a package's generated contract. */\nexport interface ActionSchema {\n models?: readonly string[];\n rules?: readonly Record<string, any>[];\n fields_by_model?: Record<string, Record<string, any>>;\n}\n\ntype Params = Record<string, unknown>;\n\n/**\n * Validates request params against a generated action schema: model\n * membership, then declared cross-field rules, then per-field\n * required/enum/integer/min/max/length. A missing schema is a no-op.\n */\nexport function validateParams(schema: ActionSchema | undefined, params: Params): void {\n if (!schema) return;\n\n const model = params['model'];\n const models = schema.models ?? [];\n let fields: Record<string, any>;\n if (models.length === 0) {\n fields = schema.fields_by_model?.['_'] ?? {};\n } else {\n if (typeof model !== 'string' || !models.includes(model)) {\n const sorted = [...models].sort();\n throw new ValidationError(`model must be one of: ${sorted.join(', ')}`);\n }\n\n fields = schema.fields_by_model?.[model] ?? {};\n }\n\n const rules = schema.rules;\n if (Array.isArray(rules)) {\n for (const rule of rules) enforceContractRule(params, rule);\n }\n\n const keys = Object.keys(fields).sort();\n for (const field of keys) {\n validateSchemaField(params, field, fields[field]);\n }\n}\n\nfunction validateSchemaField(params: Params, field: string, rules: Record<string, any>): void {\n const value = params[field];\n if (value != null && ('min_items' in rules || 'max_items' in rules)) {\n validateSchemaItemCount(field, value, rules);\n }\n\n const present = fieldPresent(params, field);\n if (rules.required && !present) {\n throw new ValidationError(`${field} is required`);\n }\n if (!present) return;\n\n if (rules.enum !== undefined && !enumValueAllowed(rules.enum, value)) {\n throw new ValidationError(`${field} must be one of: ${formatEnumValues(rules.enum)}`);\n }\n\n if (rules.type === 'integer') {\n validateSchemaInteger(field, value, rules);\n }\n\n if ('min' in rules || 'max' in rules) {\n validateSchemaRange(field, value, rules);\n }\n}\n\nfunction validateSchemaItemCount(field: string, value: unknown, rules: Record<string, any>): void {\n if (!Array.isArray(value)) {\n throw new ValidationError(`${field} must be an array`);\n }\n\n const min = rules.min_items;\n const max = rules.max_items;\n if ((min == null || value.length >= min) && (max == null || value.length <= max)) return;\n throw new ValidationError(itemCountMessage(field, min, max));\n}\n\nfunction itemCountMessage(field: string, min: unknown, max: unknown): string {\n if (min != null && max != null) {\n return `${field} must contain between ${formatValue(min)} and ${formatValue(max)} items`;\n }\n if (min != null) {\n return `${field} must contain at least ${formatValue(min)} items`;\n }\n return `${field} must contain at most ${formatValue(max)} items`;\n}\n\n// Mirrors GatewayEntry#validate_schema_integer!: a type: integer field rejects\n// non-integer numbers (e.g. 11.5), which min/max alone admit. JS has no integer\n// type, so whole-valued floats count — they serialize to an integer on the wire.\nfunction validateSchemaInteger(field: string, value: unknown, rules: Record<string, any>): void {\n if (typeof value === 'number' && Number.isInteger(value)) return;\n const detail =\n rules.min != null && rules.max != null\n ? ` between ${formatValue(rules.min)} and ${formatValue(rules.max)}`\n : '';\n throw new ValidationError(`${field} must be an integer${detail}`);\n}\n\nfunction validateSchemaRange(field: string, value: unknown, rules: Record<string, any>): void {\n let measured: number;\n let unit: string | null;\n if (rules.length) {\n measured = [...String(value)].length;\n unit = 'characters';\n } else {\n if (typeof value !== 'number') {\n throw new ValidationError(`${field} must be a number`);\n }\n measured = value;\n unit = null;\n }\n\n const min = rules.min;\n const max = rules.max;\n if ((min == null || measured >= min) && (max == null || measured <= max)) return;\n throw new ValidationError(rangeMessage(field, min, max, unit));\n}\n\nfunction rangeMessage(field: string, min: unknown, max: unknown, unit: string | null): string {\n const suffix = unit ? ` ${unit}` : '';\n if (min != null && max != null) {\n return `${field} must be between ${formatValue(min)} and ${formatValue(max)}${suffix}`;\n }\n if (min != null) {\n return `${field} must be at least ${formatValue(min)}${suffix}`;\n }\n return `${field} must be at most ${formatValue(max)}${suffix}`;\n}\n\nfunction enumValueAllowed(enumValues: readonly unknown[], value: unknown): boolean {\n const valueIsNum = typeof value === 'number';\n for (const allowed of enumValues) {\n const allowedIsNum = typeof allowed === 'number';\n if (allowedIsNum) {\n if (valueIsNum && value === allowed) return true;\n } else if (valueIsNum) {\n // allowed non-numeric while value is numeric never matches.\n } else if (String(allowed) === String(value)) {\n return true;\n }\n }\n return false;\n}\n\nfunction enforceContractRule(params: Params, rule: Record<string, any>): void {\n const conditions: Record<string, unknown> = rule.when ?? {};\n const keys = Object.keys(conditions);\n for (const key of keys) {\n if (!ruleConditionMet(params, key, conditions[key])) return;\n }\n\n const context = keys.map((key) => `${key} is ${formatValue(conditions[key])}`).join(' and ');\n for (const field of rule.required ?? []) {\n if (!fieldPresent(params, field)) {\n throw new ValidationError(`${field} is required when ${context}`);\n }\n }\n for (const field of rule.forbidden ?? []) {\n if (fieldPresent(params, field)) {\n throw new ValidationError(`${field} is not allowed when ${context}`);\n }\n }\n}\n\nfunction ruleConditionMet(params: Params, field: string, value: unknown): boolean {\n if (!(field in params)) return false;\n return String(params[field]) === String(value);\n}\n\nfunction fieldPresent(params: Params, field: string): boolean {\n if (!(field in params)) return false;\n const value = params[field];\n if (value === false) return true;\n if (Array.isArray(value)) return value.some(presentValue);\n return presentValue(value);\n}\n\nfunction presentValue(value: unknown): boolean {\n if (value === null || value === undefined || value === false) return false;\n if (value === true) return true;\n if (typeof value === 'string') return value.trim() !== '';\n if (Array.isArray(value)) return value.length > 0;\n if (typeof value === 'object') return Object.keys(value).length > 0;\n return true;\n}\n\nfunction formatValue(value: unknown): string {\n return typeof value === 'string' ? value : String(value);\n}\n\n// JS collapses float literals (0.0 -> 0), losing the float type the other SDKs\n// keep. When an enum has a fractional member it is a float enum, so render its\n// whole-number members with a trailing .0 to match the gateway/Go/Ruby/Python\n// message text (e.g. \"0.0, 0.5, 1.0\", not \"0, 0.5, 1\").\nfunction formatEnumValues(values: readonly unknown[]): string {\n const floatEnum = values.some((v) => typeof v === 'number' && !Number.isInteger(v));\n return values\n .map((v) => (floatEnum && typeof v === 'number' ? formatFloat(v) : formatValue(v)))\n .join(', ');\n}\n\nfunction formatFloat(value: number): string {\n const text = String(value);\n return /[.eE]/.test(text) ? text : `${text}.0`;\n}\n","// RFC 1321 MD5 over raw bytes, returning the Base64 of the 16-byte digest — the\n// value the upload target expects as the Content-MD5 header on a direct-upload\n// PUT. Web Crypto has no MD5, so direct upload needs this pure implementation to\n// run in browsers as well as Node.\n\nconst SHIFTS = [\n 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,\n 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,\n 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,\n 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21,\n];\n\nconst K = Array.from({ length: 64 }, (_v, i) =>\n Math.floor(Math.abs(Math.sin(i + 1)) * 4294967296),\n);\n\nfunction add32(a: number, b: number): number {\n return (a + b) & 0xffffffff;\n}\n\nfunction rotl(value: number, bits: number): number {\n return (value << bits) | (value >>> (32 - bits));\n}\n\nfunction md5Bytes(input: Uint8Array): Uint8Array {\n const withOne = input.length + 1;\n const totalLen = withOne + ((56 - (withOne % 64) + 64) % 64) + 8;\n const msg = new Uint8Array(totalLen);\n msg.set(input);\n msg[input.length] = 0x80;\n\n const view = new DataView(msg.buffer);\n const bitLen = input.length * 8;\n view.setUint32(totalLen - 8, bitLen >>> 0, true);\n view.setUint32(totalLen - 4, Math.floor(bitLen / 0x100000000) >>> 0, true);\n\n let a0 = 0x67452301;\n let b0 = 0xefcdab89;\n let c0 = 0x98badcfe;\n let d0 = 0x10325476;\n\n const m = new Int32Array(16);\n for (let offset = 0; offset < totalLen; offset += 64) {\n for (let j = 0; j < 16; j += 1) {\n m[j] = view.getUint32(offset + j * 4, true);\n }\n\n let a = a0;\n let b = b0;\n let c = c0;\n let d = d0;\n\n for (let i = 0; i < 64; i += 1) {\n let f: number;\n let g: number;\n if (i < 16) {\n f = (b & c) | (~b & d);\n g = i;\n } else if (i < 32) {\n f = (d & b) | (~d & c);\n g = (5 * i + 1) % 16;\n } else if (i < 48) {\n f = b ^ c ^ d;\n g = (3 * i + 5) % 16;\n } else {\n f = c ^ (b | ~d);\n g = (7 * i) % 16;\n }\n\n f = add32(add32(f, a), add32(K[i], m[g]));\n a = d;\n d = c;\n c = b;\n b = add32(b, rotl(f, SHIFTS[i]));\n }\n\n a0 = add32(a0, a);\n b0 = add32(b0, b);\n c0 = add32(c0, c);\n d0 = add32(d0, d);\n }\n\n const out = new Uint8Array(16);\n const outView = new DataView(out.buffer);\n outView.setUint32(0, a0 >>> 0, true);\n outView.setUint32(4, b0 >>> 0, true);\n outView.setUint32(8, c0 >>> 0, true);\n outView.setUint32(12, d0 >>> 0, true);\n return out;\n}\n\nconst BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n let out = '';\n for (let i = 0; i < bytes.length; i += 3) {\n const b0 = bytes[i];\n const b1 = i + 1 < bytes.length ? bytes[i + 1] : 0;\n const b2 = i + 2 < bytes.length ? bytes[i + 2] : 0;\n out += BASE64_CHARS[b0 >> 2];\n out += BASE64_CHARS[((b0 & 3) << 4) | (b1 >> 4)];\n out += i + 1 < bytes.length ? BASE64_CHARS[((b1 & 15) << 2) | (b2 >> 6)] : '=';\n out += i + 2 < bytes.length ? BASE64_CHARS[b2 & 63] : '=';\n }\n return out;\n}\n\nexport function md5Base64(bytes: Uint8Array): string {\n return bytesToBase64(md5Bytes(bytes));\n}\n","import type { HttpClient } from './http';\nimport type { RequestOptions } from './types';\nimport { compactParams } from './params';\nimport { md5Base64 } from './md5';\n\nconst ENDPOINT = '/api/v1/files';\nconst PREPARE_ENDPOINT = `${ENDPOINT}/prepare`;\nconst CONFIRM_ENDPOINT = `${ENDPOINT}/confirm`;\n\ninterface PrepareResponse {\n signed_id: string;\n upload_url: string;\n headers: Record<string, string>;\n}\n\nexport interface FileUploadResponse {\n file_name: string;\n url: string;\n size_bytes: number;\n mime_type: string;\n created_at: string;\n expires_at: string;\n}\n\nexport type FileSource =\n | { type: 'url'; url: string }\n | { type: 'base64'; data: string };\n\nexport type FileCreateParams =\n | {\n file: Blob;\n file_name?: string;\n source?: never;\n }\n | {\n source: FileSource;\n file_name?: string;\n file?: never;\n };\n\nexport class Files {\n constructor(private readonly http: HttpClient) {}\n\n async create(params: FileCreateParams, options?: RequestOptions): Promise<FileUploadResponse> {\n const rawParams = params as { file?: Blob; source?: FileSource; file_name?: string };\n const hasFile = Boolean(rawParams.file);\n const hasSource = Boolean(rawParams.source);\n if (Number(hasFile) + Number(hasSource) !== 1) {\n throw new Error('Exactly one source is required: file or source');\n }\n\n if (hasFile) {\n return this.uploadDirect(rawParams.file as Blob, params.file_name, options);\n }\n\n return this.http.request<FileUploadResponse>('POST', ENDPOINT, {\n body: compactParams(params),\n ...options,\n });\n }\n\n // Local files upload straight to storage: ask for a pre-authorized target,\n // PUT the bytes there (never through the API), then confirm. The caller still\n // sees a single create() call.\n private async uploadDirect(\n file: Blob,\n fileName: string | undefined,\n options?: RequestOptions,\n ): Promise<FileUploadResponse> {\n const bytes = new Uint8Array(await file.arrayBuffer());\n const filename = fileName ?? (file as { name?: string }).name ?? 'upload';\n const contentType = file.type || 'application/octet-stream';\n\n const prepared = await this.http.request<PrepareResponse>('POST', PREPARE_ENDPOINT, {\n body: {\n filename,\n byte_size: bytes.byteLength,\n checksum: md5Base64(bytes),\n content_type: contentType,\n },\n ...options,\n });\n\n await this.http.upload(prepared.upload_url, {\n headers: prepared.headers,\n body: bytes,\n timeoutMs: options?.timeoutMs,\n signal: options?.signal,\n });\n\n return this.http.request<FileUploadResponse>('POST', CONFIRM_ENDPOINT, {\n body: { signed_id: prepared.signed_id },\n ...options,\n });\n }\n}\n","import type { HttpClient } from './http';\nimport type { RequestOptions } from './types';\n\nconst INFO_ENDPOINT = '/api/v1/me';\nconst BALANCE_ENDPOINT = '/api/v1/me/balance';\n\nexport interface AccountInfoResponse {\n id: number;\n name: string;\n email: string;\n account: {\n id: number;\n name: string;\n };\n}\n\nexport interface AccountBalanceResponse {\n balance_cents: number;\n paid_balance_cents: number;\n bonus_balance_cents: number;\n spent_cents_today: number;\n spent_cents_total: number;\n}\n\nexport class Account {\n constructor(private readonly http: HttpClient) {}\n\n async info(options?: RequestOptions): Promise<AccountInfoResponse> {\n return this.http.request<AccountInfoResponse>('GET', INFO_ENDPOINT, { ...options });\n }\n\n async balance(options?: RequestOptions): Promise<AccountBalanceResponse> {\n return this.http.request<AccountBalanceResponse>('GET', BALANCE_ENDPOINT, { ...options });\n }\n}\n","import { createHttpClient, type HttpClient } from './http';\nimport { resolveApiKey } from './auth';\nimport type { ClientOptions } from './types';\nimport { Files } from './files';\nimport { Account } from './account';\n\n/**\n * Base class for every RunAPI client. Resolves the API key, builds the shared\n * HTTP client, and exposes the Universal Resources (file upload, account) that\n * are available on any client regardless of which model package was imported.\n *\n * Provider clients extend this and build their model resources from `this.http`.\n */\nexport class BaseClient {\n /** Temporary file upload operations. */\n public readonly files: Files;\n /** Account info and balance operations. */\n public readonly account: Account;\n\n protected readonly http: HttpClient;\n private readonly apiKey: string;\n\n constructor(options: ClientOptions = {}) {\n this.apiKey = resolveApiKey(options);\n this.http = createHttpClient(options);\n this.files = new Files(this.http);\n this.account = new Account(this.http);\n }\n\n getApiKey() {\n return this.apiKey;\n }\n}\n"],"mappings":"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","names":[]} |
+22
-1
@@ -289,2 +289,6 @@ import { | ||
| function validateSchemaField(params, field, rules) { | ||
| const value = params[field]; | ||
| if (value != null && ("min_items" in rules || "max_items" in rules)) { | ||
| validateSchemaItemCount(field, value, rules); | ||
| } | ||
| const present = fieldPresent(params, field); | ||
@@ -295,3 +299,2 @@ if (rules.required && !present) { | ||
| if (!present) return; | ||
| const value = params[field]; | ||
| if (rules.enum !== void 0 && !enumValueAllowed(rules.enum, value)) { | ||
@@ -307,2 +310,20 @@ throw new ValidationError(`${field} must be one of: ${formatEnumValues(rules.enum)}`); | ||
| } | ||
| function validateSchemaItemCount(field, value, rules) { | ||
| if (!Array.isArray(value)) { | ||
| throw new ValidationError(`${field} must be an array`); | ||
| } | ||
| const min = rules.min_items; | ||
| const max = rules.max_items; | ||
| if ((min == null || value.length >= min) && (max == null || value.length <= max)) return; | ||
| throw new ValidationError(itemCountMessage(field, min, max)); | ||
| } | ||
| function itemCountMessage(field, min, max) { | ||
| if (min != null && max != null) { | ||
| return `${field} must contain between ${formatValue(min)} and ${formatValue(max)} items`; | ||
| } | ||
| if (min != null) { | ||
| return `${field} must contain at least ${formatValue(min)} items`; | ||
| } | ||
| return `${field} must contain at most ${formatValue(max)} items`; | ||
| } | ||
| function validateSchemaInteger(field, value, rules) { | ||
@@ -309,0 +330,0 @@ if (typeof value === "number" && Number.isInteger(value)) return; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/auth.ts","../src/http.ts","../src/params.ts","../src/validate.ts","../src/md5.ts","../src/files.ts","../src/account.ts","../src/base-client.ts","../src/index.ts"],"sourcesContent":["import { AuthenticationError } from './errors';\nimport type { ClientOptions } from './types';\n\nconst ENV_VAR_NAME = 'RUNAPI_API_KEY';\n\nfunction readApiKeyFromEnv(): string | undefined {\n if (typeof process === 'undefined' || !process.env) {\n return undefined;\n }\n const trimmed = process.env[ENV_VAR_NAME]?.trim();\n return trimmed ? trimmed : undefined;\n}\n\n/**\n * Resolve the API key from explicit options or the `RUNAPI_API_KEY` environment\n * variable. Throws `AuthenticationError` when neither is provided.\n */\nexport function resolveApiKey(options: ClientOptions): string {\n const explicit = options.apiKey?.trim();\n const apiKey = explicit || readApiKeyFromEnv();\n if (!apiKey) {\n throw new AuthenticationError(\n `API key is required. Pass \\`apiKey\\` or set the \\`${ENV_VAR_NAME}\\` environment variable.`\n );\n }\n return apiKey;\n}\n","import { resolveApiKey } from './auth';\nimport {\n errorFromResponse,\n NetworkError,\n RunApiError,\n TimeoutError,\n} from './errors';\nimport {\n getRetryDelayMs,\n isIdempotentMethod,\n isRetryableStatus,\n parseRetryAfterMs,\n} from './retry';\nimport type { ClientOptions, HttpMethod, QueryParams, RequestOptions } from './types';\nimport {\n DEFAULT_BASE_URL,\n RETRY_CONFIG,\n SDK_USER_AGENT,\n TIMEOUTS,\n} from './constants';\n\nexport interface HttpRequestOptions extends RequestOptions {\n query?: QueryParams;\n body?: unknown;\n}\n\nexport interface HttpClient {\n request<T>(\n method: HttpMethod,\n path: string,\n options?: HttpRequestOptions\n ): Promise<T>;\n /**\n * PUT bytes straight to an absolute upload URL with the exact headers issued\n * for it. Skips the base URL, auth, and retries — the URL is single-use and\n * pre-authorized, and the body is not safe to replay.\n */\n upload(\n url: string,\n options: { headers: Record<string, string>; body: BodyInit; timeoutMs?: number; signal?: AbortSignal }\n ): Promise<void>;\n}\n\nfunction buildUrl(baseUrl: string, path: string, query?: QueryParams): string {\n const normalizedBase = baseUrl.replace(/\\/+$/, '');\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n const url = new URL(`${normalizedBase}${normalizedPath}`);\n\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null) {\n continue;\n }\n url.searchParams.set(key, String(value));\n }\n }\n\n return url.toString();\n}\n\nfunction mergeHeaders(\n base: Record<string, string>,\n extra?: Record<string, string>\n): Record<string, string> {\n return { ...base, ...(extra || {}) };\n}\n\nfunction hasHeader(headers: Record<string, string>, name: string): boolean {\n const target = name.toLowerCase();\n return Object.keys(headers).some((key) => key.toLowerCase() === target);\n}\n\nfunction isFormData(body: unknown): body is FormData {\n return typeof FormData !== 'undefined' && body instanceof FormData;\n}\n\nfunction prepareBody(body: unknown, headers: Record<string, string>): BodyInit | undefined {\n if (body === undefined || body === null) {\n return undefined;\n }\n\n if (isFormData(body) || body instanceof URLSearchParams) {\n return body as BodyInit;\n }\n\n if (typeof body === 'string' || body instanceof Blob || body instanceof ArrayBuffer) {\n return body as BodyInit;\n }\n\n if (!hasHeader(headers, 'content-type')) {\n headers['content-type'] = 'application/json';\n }\n\n return JSON.stringify(body);\n}\n\nasync function parseResponseBody(response: Response): Promise<{\n text: string | null;\n json: unknown;\n}> {\n const text = await response.text();\n if (!text) {\n return { text: null, json: undefined };\n }\n\n try {\n return { text, json: JSON.parse(text) };\n } catch {\n return { text, json: undefined };\n }\n}\n\nfunction createAbortController(\n timeoutMs: number,\n signal?: AbortSignal\n): { controller: AbortController; cleanup: () => void; timedOut: () => boolean } {\n const controller = new AbortController();\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let didTimeOut = false;\n\n if (signal) {\n if (signal.aborted) {\n controller.abort();\n } else {\n signal.addEventListener(\n 'abort',\n () => {\n controller.abort();\n },\n { once: true }\n );\n }\n }\n\n if (timeoutMs > 0) {\n timeoutId = setTimeout(() => {\n didTimeOut = true;\n controller.abort();\n }, timeoutMs);\n }\n\n return {\n controller,\n cleanup: () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n },\n timedOut: () => didTimeOut,\n };\n}\n\nfunction shouldRetryRequest(method: HttpMethod, status: number | undefined): boolean {\n if (status === undefined) {\n return false;\n }\n\n if (!isRetryableStatus(status)) {\n return false;\n }\n\n if (isIdempotentMethod(method)) {\n return true;\n }\n\n return false;\n}\n\nexport function createHttpClient(options: ClientOptions): HttpClient {\n const apiKey = resolveApiKey(options);\n const baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n const clientTimeoutMs = options.timeoutMs;\n const maxRetries = options.maxRetries ?? RETRY_CONFIG.MAX_RETRIES;\n const retryBaseDelayMs = options.retryBaseDelayMs ?? RETRY_CONFIG.BASE_DELAY;\n const retryMaxDelayMs = options.retryMaxDelayMs ?? RETRY_CONFIG.MAX_DELAY;\n const fetchImpl = options.fetch ?? fetch;\n const clientFetchOptions = options.fetchOptions ?? {};\n\n return {\n async request<T>(\n method: HttpMethod,\n path: string,\n requestOptions: HttpRequestOptions = {}\n ) {\n const url = buildUrl(baseUrl, path, requestOptions.query);\n const headers = mergeHeaders(\n {\n accept: 'application/json',\n authorization: `Bearer ${apiKey}`,\n 'user-agent': SDK_USER_AGENT,\n },\n requestOptions.headers\n );\n\n const body = prepareBody(requestOptions.body, headers);\n const requestTimeoutMs = requestOptions.timeoutMs ?? clientTimeoutMs ?? TIMEOUTS.HTTP_REQUEST;\n const requestMaxRetries = requestOptions.maxRetries ?? maxRetries;\n\n for (let attempt = 0; attempt <= requestMaxRetries; attempt += 1) {\n const { controller, cleanup, timedOut } = createAbortController(\n requestTimeoutMs,\n requestOptions.signal\n );\n\n try {\n const response = await fetchImpl(url, {\n ...clientFetchOptions,\n ...(requestOptions.fetchOptions ?? {}),\n method,\n headers,\n body,\n signal: controller.signal,\n });\n\n cleanup();\n\n const { text, json } = await parseResponseBody(response);\n\n if (!response.ok) {\n if (\n attempt < requestMaxRetries &&\n shouldRetryRequest(method, response.status)\n ) {\n const retryAfterMs = parseRetryAfterMs(response);\n const delayMs =\n retryAfterMs ??\n getRetryDelayMs(attempt, retryBaseDelayMs, retryMaxDelayMs);\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n continue;\n }\n\n throw errorFromResponse(response, text, json);\n }\n\n return (json ?? text) as T;\n } catch (error) {\n cleanup();\n\n if (timedOut()) {\n if (attempt < requestMaxRetries && isIdempotentMethod(method)) {\n const delayMs = getRetryDelayMs(\n attempt,\n retryBaseDelayMs,\n retryMaxDelayMs\n );\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n continue;\n }\n\n throw new TimeoutError('Request timed out');\n }\n\n if (requestOptions.signal?.aborted) {\n throw new RunApiError('Request aborted', { cause: error as Error });\n }\n\n if (error instanceof RunApiError) {\n throw error;\n }\n\n if (attempt < requestMaxRetries && isIdempotentMethod(method)) {\n const delayMs = getRetryDelayMs(\n attempt,\n retryBaseDelayMs,\n retryMaxDelayMs\n );\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n continue;\n }\n\n throw new NetworkError('Network error', { cause: error as Error });\n }\n }\n\n // Unreachable at runtime, but required for TypeScript return type inference\n throw new NetworkError('Network error');\n },\n\n async upload(url, uploadOptions) {\n const timeoutMs = uploadOptions.timeoutMs ?? clientTimeoutMs ?? TIMEOUTS.HTTP_REQUEST;\n const { controller, cleanup, timedOut } = createAbortController(timeoutMs, uploadOptions.signal);\n\n try {\n const response = await fetchImpl(url, {\n ...clientFetchOptions,\n method: 'PUT',\n headers: uploadOptions.headers,\n body: uploadOptions.body,\n signal: controller.signal,\n });\n cleanup();\n\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new RunApiError(`Direct upload failed with status ${response.status}${text ? `: ${text}` : ''}`);\n }\n } catch (error) {\n cleanup();\n if (timedOut()) {\n throw new TimeoutError('Direct upload timed out');\n }\n if (error instanceof RunApiError) {\n throw error;\n }\n throw new NetworkError('Direct upload network error', { cause: error as Error });\n }\n },\n };\n}\n","export function compactParams<T extends object>(params: T): Partial<T> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined || value === null) continue;\n if (typeof value === 'string' && value.trim() === '') continue;\n result[key] = value;\n }\n return result as Partial<T>;\n}\n","import { ValidationError } from './errors';\n\n/** One action entry from a package's generated contract. */\nexport interface ActionSchema {\n models?: readonly string[];\n rules?: readonly Record<string, any>[];\n fields_by_model?: Record<string, Record<string, any>>;\n}\n\ntype Params = Record<string, unknown>;\n\n/**\n * Validates request params against a generated action schema: model\n * membership, then declared cross-field rules, then per-field\n * required/enum/integer/min/max/length. A missing schema is a no-op.\n */\nexport function validateParams(schema: ActionSchema | undefined, params: Params): void {\n if (!schema) return;\n\n const model = params['model'];\n const models = schema.models ?? [];\n let fields: Record<string, any>;\n if (models.length === 0) {\n fields = schema.fields_by_model?.['_'] ?? {};\n } else {\n if (typeof model !== 'string' || !models.includes(model)) {\n const sorted = [...models].sort();\n throw new ValidationError(`model must be one of: ${sorted.join(', ')}`);\n }\n\n fields = schema.fields_by_model?.[model] ?? {};\n }\n\n const rules = schema.rules;\n if (Array.isArray(rules)) {\n for (const rule of rules) enforceContractRule(params, rule);\n }\n\n const keys = Object.keys(fields).sort();\n for (const field of keys) {\n validateSchemaField(params, field, fields[field]);\n }\n}\n\nfunction validateSchemaField(params: Params, field: string, rules: Record<string, any>): void {\n const present = fieldPresent(params, field);\n if (rules.required && !present) {\n throw new ValidationError(`${field} is required`);\n }\n if (!present) return;\n\n const value = params[field];\n if (rules.enum !== undefined && !enumValueAllowed(rules.enum, value)) {\n throw new ValidationError(`${field} must be one of: ${formatEnumValues(rules.enum)}`);\n }\n\n if (rules.type === 'integer') {\n validateSchemaInteger(field, value, rules);\n }\n\n if ('min' in rules || 'max' in rules) {\n validateSchemaRange(field, value, rules);\n }\n}\n\n// Mirrors GatewayEntry#validate_schema_integer!: a type: integer field rejects\n// non-integer numbers (e.g. 11.5), which min/max alone admit. JS has no integer\n// type, so whole-valued floats count — they serialize to an integer on the wire.\nfunction validateSchemaInteger(field: string, value: unknown, rules: Record<string, any>): void {\n if (typeof value === 'number' && Number.isInteger(value)) return;\n const detail =\n rules.min != null && rules.max != null\n ? ` between ${formatValue(rules.min)} and ${formatValue(rules.max)}`\n : '';\n throw new ValidationError(`${field} must be an integer${detail}`);\n}\n\nfunction validateSchemaRange(field: string, value: unknown, rules: Record<string, any>): void {\n let measured: number;\n let unit: string | null;\n if (rules.length) {\n measured = [...String(value)].length;\n unit = 'characters';\n } else {\n if (typeof value !== 'number') {\n throw new ValidationError(`${field} must be a number`);\n }\n measured = value;\n unit = null;\n }\n\n const min = rules.min;\n const max = rules.max;\n if ((min == null || measured >= min) && (max == null || measured <= max)) return;\n throw new ValidationError(rangeMessage(field, min, max, unit));\n}\n\nfunction rangeMessage(field: string, min: unknown, max: unknown, unit: string | null): string {\n const suffix = unit ? ` ${unit}` : '';\n if (min != null && max != null) {\n return `${field} must be between ${formatValue(min)} and ${formatValue(max)}${suffix}`;\n }\n if (min != null) {\n return `${field} must be at least ${formatValue(min)}${suffix}`;\n }\n return `${field} must be at most ${formatValue(max)}${suffix}`;\n}\n\nfunction enumValueAllowed(enumValues: readonly unknown[], value: unknown): boolean {\n const valueIsNum = typeof value === 'number';\n for (const allowed of enumValues) {\n const allowedIsNum = typeof allowed === 'number';\n if (allowedIsNum) {\n if (valueIsNum && value === allowed) return true;\n } else if (valueIsNum) {\n // allowed non-numeric while value is numeric never matches.\n } else if (String(allowed) === String(value)) {\n return true;\n }\n }\n return false;\n}\n\nfunction enforceContractRule(params: Params, rule: Record<string, any>): void {\n const conditions: Record<string, unknown> = rule.when ?? {};\n const keys = Object.keys(conditions);\n for (const key of keys) {\n if (!ruleConditionMet(params, key, conditions[key])) return;\n }\n\n const context = keys.map((key) => `${key} is ${formatValue(conditions[key])}`).join(' and ');\n for (const field of rule.required ?? []) {\n if (!fieldPresent(params, field)) {\n throw new ValidationError(`${field} is required when ${context}`);\n }\n }\n for (const field of rule.forbidden ?? []) {\n if (fieldPresent(params, field)) {\n throw new ValidationError(`${field} is not allowed when ${context}`);\n }\n }\n}\n\nfunction ruleConditionMet(params: Params, field: string, value: unknown): boolean {\n if (!(field in params)) return false;\n return String(params[field]) === String(value);\n}\n\nfunction fieldPresent(params: Params, field: string): boolean {\n if (!(field in params)) return false;\n const value = params[field];\n if (value === false) return true;\n if (Array.isArray(value)) return value.some(presentValue);\n return presentValue(value);\n}\n\nfunction presentValue(value: unknown): boolean {\n if (value === null || value === undefined || value === false) return false;\n if (value === true) return true;\n if (typeof value === 'string') return value.trim() !== '';\n if (Array.isArray(value)) return value.length > 0;\n if (typeof value === 'object') return Object.keys(value).length > 0;\n return true;\n}\n\nfunction formatValue(value: unknown): string {\n return typeof value === 'string' ? value : String(value);\n}\n\n// JS collapses float literals (0.0 -> 0), losing the float type the other SDKs\n// keep. When an enum has a fractional member it is a float enum, so render its\n// whole-number members with a trailing .0 to match the gateway/Go/Ruby/Python\n// message text (e.g. \"0.0, 0.5, 1.0\", not \"0, 0.5, 1\").\nfunction formatEnumValues(values: readonly unknown[]): string {\n const floatEnum = values.some((v) => typeof v === 'number' && !Number.isInteger(v));\n return values\n .map((v) => (floatEnum && typeof v === 'number' ? formatFloat(v) : formatValue(v)))\n .join(', ');\n}\n\nfunction formatFloat(value: number): string {\n const text = String(value);\n return /[.eE]/.test(text) ? text : `${text}.0`;\n}\n","// RFC 1321 MD5 over raw bytes, returning the Base64 of the 16-byte digest — the\n// value the upload target expects as the Content-MD5 header on a direct-upload\n// PUT. Web Crypto has no MD5, so direct upload needs this pure implementation to\n// run in browsers as well as Node.\n\nconst SHIFTS = [\n 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,\n 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,\n 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,\n 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21,\n];\n\nconst K = Array.from({ length: 64 }, (_v, i) =>\n Math.floor(Math.abs(Math.sin(i + 1)) * 4294967296),\n);\n\nfunction add32(a: number, b: number): number {\n return (a + b) & 0xffffffff;\n}\n\nfunction rotl(value: number, bits: number): number {\n return (value << bits) | (value >>> (32 - bits));\n}\n\nfunction md5Bytes(input: Uint8Array): Uint8Array {\n const withOne = input.length + 1;\n const totalLen = withOne + ((56 - (withOne % 64) + 64) % 64) + 8;\n const msg = new Uint8Array(totalLen);\n msg.set(input);\n msg[input.length] = 0x80;\n\n const view = new DataView(msg.buffer);\n const bitLen = input.length * 8;\n view.setUint32(totalLen - 8, bitLen >>> 0, true);\n view.setUint32(totalLen - 4, Math.floor(bitLen / 0x100000000) >>> 0, true);\n\n let a0 = 0x67452301;\n let b0 = 0xefcdab89;\n let c0 = 0x98badcfe;\n let d0 = 0x10325476;\n\n const m = new Int32Array(16);\n for (let offset = 0; offset < totalLen; offset += 64) {\n for (let j = 0; j < 16; j += 1) {\n m[j] = view.getUint32(offset + j * 4, true);\n }\n\n let a = a0;\n let b = b0;\n let c = c0;\n let d = d0;\n\n for (let i = 0; i < 64; i += 1) {\n let f: number;\n let g: number;\n if (i < 16) {\n f = (b & c) | (~b & d);\n g = i;\n } else if (i < 32) {\n f = (d & b) | (~d & c);\n g = (5 * i + 1) % 16;\n } else if (i < 48) {\n f = b ^ c ^ d;\n g = (3 * i + 5) % 16;\n } else {\n f = c ^ (b | ~d);\n g = (7 * i) % 16;\n }\n\n f = add32(add32(f, a), add32(K[i], m[g]));\n a = d;\n d = c;\n c = b;\n b = add32(b, rotl(f, SHIFTS[i]));\n }\n\n a0 = add32(a0, a);\n b0 = add32(b0, b);\n c0 = add32(c0, c);\n d0 = add32(d0, d);\n }\n\n const out = new Uint8Array(16);\n const outView = new DataView(out.buffer);\n outView.setUint32(0, a0 >>> 0, true);\n outView.setUint32(4, b0 >>> 0, true);\n outView.setUint32(8, c0 >>> 0, true);\n outView.setUint32(12, d0 >>> 0, true);\n return out;\n}\n\nconst BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n let out = '';\n for (let i = 0; i < bytes.length; i += 3) {\n const b0 = bytes[i];\n const b1 = i + 1 < bytes.length ? bytes[i + 1] : 0;\n const b2 = i + 2 < bytes.length ? bytes[i + 2] : 0;\n out += BASE64_CHARS[b0 >> 2];\n out += BASE64_CHARS[((b0 & 3) << 4) | (b1 >> 4)];\n out += i + 1 < bytes.length ? BASE64_CHARS[((b1 & 15) << 2) | (b2 >> 6)] : '=';\n out += i + 2 < bytes.length ? BASE64_CHARS[b2 & 63] : '=';\n }\n return out;\n}\n\nexport function md5Base64(bytes: Uint8Array): string {\n return bytesToBase64(md5Bytes(bytes));\n}\n","import type { HttpClient } from './http';\nimport type { RequestOptions } from './types';\nimport { compactParams } from './params';\nimport { md5Base64 } from './md5';\n\nconst ENDPOINT = '/api/v1/files';\nconst PREPARE_ENDPOINT = `${ENDPOINT}/prepare`;\nconst CONFIRM_ENDPOINT = `${ENDPOINT}/confirm`;\n\ninterface PrepareResponse {\n signed_id: string;\n upload_url: string;\n headers: Record<string, string>;\n}\n\nexport interface FileUploadResponse {\n file_name: string;\n url: string;\n size_bytes: number;\n mime_type: string;\n created_at: string;\n expires_at: string;\n}\n\nexport type FileSource =\n | { type: 'url'; url: string }\n | { type: 'base64'; data: string };\n\nexport type FileCreateParams =\n | {\n file: Blob;\n file_name?: string;\n source?: never;\n }\n | {\n source: FileSource;\n file_name?: string;\n file?: never;\n };\n\nexport class Files {\n constructor(private readonly http: HttpClient) {}\n\n async create(params: FileCreateParams, options?: RequestOptions): Promise<FileUploadResponse> {\n const rawParams = params as { file?: Blob; source?: FileSource; file_name?: string };\n const hasFile = Boolean(rawParams.file);\n const hasSource = Boolean(rawParams.source);\n if (Number(hasFile) + Number(hasSource) !== 1) {\n throw new Error('Exactly one source is required: file or source');\n }\n\n if (hasFile) {\n return this.uploadDirect(rawParams.file as Blob, params.file_name, options);\n }\n\n return this.http.request<FileUploadResponse>('POST', ENDPOINT, {\n body: compactParams(params),\n ...options,\n });\n }\n\n // Local files upload straight to storage: ask for a pre-authorized target,\n // PUT the bytes there (never through the API), then confirm. The caller still\n // sees a single create() call.\n private async uploadDirect(\n file: Blob,\n fileName: string | undefined,\n options?: RequestOptions,\n ): Promise<FileUploadResponse> {\n const bytes = new Uint8Array(await file.arrayBuffer());\n const filename = fileName ?? (file as { name?: string }).name ?? 'upload';\n const contentType = file.type || 'application/octet-stream';\n\n const prepared = await this.http.request<PrepareResponse>('POST', PREPARE_ENDPOINT, {\n body: {\n filename,\n byte_size: bytes.byteLength,\n checksum: md5Base64(bytes),\n content_type: contentType,\n },\n ...options,\n });\n\n await this.http.upload(prepared.upload_url, {\n headers: prepared.headers,\n body: bytes,\n timeoutMs: options?.timeoutMs,\n signal: options?.signal,\n });\n\n return this.http.request<FileUploadResponse>('POST', CONFIRM_ENDPOINT, {\n body: { signed_id: prepared.signed_id },\n ...options,\n });\n }\n}\n","import type { HttpClient } from './http';\nimport type { RequestOptions } from './types';\n\nconst INFO_ENDPOINT = '/api/v1/me';\nconst BALANCE_ENDPOINT = '/api/v1/me/balance';\n\nexport interface AccountInfoResponse {\n id: number;\n name: string;\n email: string;\n account: {\n id: number;\n name: string;\n };\n}\n\nexport interface AccountBalanceResponse {\n balance_cents: number;\n paid_balance_cents: number;\n bonus_balance_cents: number;\n spent_cents_today: number;\n spent_cents_total: number;\n}\n\nexport class Account {\n constructor(private readonly http: HttpClient) {}\n\n async info(options?: RequestOptions): Promise<AccountInfoResponse> {\n return this.http.request<AccountInfoResponse>('GET', INFO_ENDPOINT, { ...options });\n }\n\n async balance(options?: RequestOptions): Promise<AccountBalanceResponse> {\n return this.http.request<AccountBalanceResponse>('GET', BALANCE_ENDPOINT, { ...options });\n }\n}\n","import { createHttpClient, type HttpClient } from './http';\nimport { resolveApiKey } from './auth';\nimport type { ClientOptions } from './types';\nimport { Files } from './files';\nimport { Account } from './account';\n\n/**\n * Base class for every RunAPI client. Resolves the API key, builds the shared\n * HTTP client, and exposes the Universal Resources (file upload, account) that\n * are available on any client regardless of which model package was imported.\n *\n * Provider clients extend this and build their model resources from `this.http`.\n */\nexport class BaseClient {\n /** Temporary file upload operations. */\n public readonly files: Files;\n /** Account info and balance operations. */\n public readonly account: Account;\n\n protected readonly http: HttpClient;\n private readonly apiKey: string;\n\n constructor(options: ClientOptions = {}) {\n this.apiKey = resolveApiKey(options);\n this.http = createHttpClient(options);\n this.files = new Files(this.http);\n this.account = new Account(this.http);\n }\n\n getApiKey() {\n return this.apiKey;\n }\n}\n","// Types\nexport type {\n HttpMethod,\n QueryParams,\n ClientOptions,\n RequestOptions,\n PollingOptions,\n TaskStatus,\n AsyncTaskStatus,\n TaskResponse,\n} from './types';\n\n// Constants\nexport { TIMEOUTS, RETRY_CONFIG, DEFAULT_BASE_URL, SDK_USER_AGENT } from './constants';\n\n// Errors\nexport {\n RunApiError,\n AuthenticationError,\n RateLimitError,\n InsufficientCreditsError,\n NotFoundError,\n ValidationError,\n ServiceUnavailableError,\n NetworkError,\n TimeoutError,\n TaskTimeoutError,\n TaskFailedError,\n errorFromResponse,\n} from './errors';\nexport type { RunApiErrorOptions } from './errors';\n\n// Auth\nexport { resolveApiKey } from './auth';\n\n// HTTP Client\nexport { createHttpClient } from './http';\nexport type { HttpClient, HttpRequestOptions } from './http';\n\n// Retry (高级用户可用)\nexport {\n getRetryDelayMs,\n isRetryableStatus,\n isIdempotentMethod,\n parseRetryAfterMs,\n} from './retry';\nexport type { RetryOptions } from './retry';\n\n// Params\nexport { compactParams } from './params';\n\n// Contract validation\nexport { validateParams } from './validate';\nexport type { ActionSchema } from './validate';\n\n// Files\nexport { Files } from './files';\nexport type { FileCreateParams, FileSource, FileUploadResponse } from './files';\n\n// Account\nexport { Account } from './account';\nexport type { AccountInfoResponse, AccountBalanceResponse } from './account';\n\n// Base client\nexport { BaseClient } from './base-client';\n\n// Version\nexport const version = '0.1.0';\n\n// Note: pollUntilComplete 不从主入口导出,避免 PollingOptions 类型暴露\n// 各 API 包(suno/veo-3-1 等)通过 '@runapi.ai/core/internal' 导入\n"],"mappings":"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","names":[]} | ||
| {"version":3,"sources":["../src/auth.ts","../src/http.ts","../src/params.ts","../src/validate.ts","../src/md5.ts","../src/files.ts","../src/account.ts","../src/base-client.ts","../src/index.ts"],"sourcesContent":["import { AuthenticationError } from './errors';\nimport type { ClientOptions } from './types';\n\nconst ENV_VAR_NAME = 'RUNAPI_API_KEY';\n\nfunction readApiKeyFromEnv(): string | undefined {\n if (typeof process === 'undefined' || !process.env) {\n return undefined;\n }\n const trimmed = process.env[ENV_VAR_NAME]?.trim();\n return trimmed ? trimmed : undefined;\n}\n\n/**\n * Resolve the API key from explicit options or the `RUNAPI_API_KEY` environment\n * variable. Throws `AuthenticationError` when neither is provided.\n */\nexport function resolveApiKey(options: ClientOptions): string {\n const explicit = options.apiKey?.trim();\n const apiKey = explicit || readApiKeyFromEnv();\n if (!apiKey) {\n throw new AuthenticationError(\n `API key is required. Pass \\`apiKey\\` or set the \\`${ENV_VAR_NAME}\\` environment variable.`\n );\n }\n return apiKey;\n}\n","import { resolveApiKey } from './auth';\nimport {\n errorFromResponse,\n NetworkError,\n RunApiError,\n TimeoutError,\n} from './errors';\nimport {\n getRetryDelayMs,\n isIdempotentMethod,\n isRetryableStatus,\n parseRetryAfterMs,\n} from './retry';\nimport type { ClientOptions, HttpMethod, QueryParams, RequestOptions } from './types';\nimport {\n DEFAULT_BASE_URL,\n RETRY_CONFIG,\n SDK_USER_AGENT,\n TIMEOUTS,\n} from './constants';\n\nexport interface HttpRequestOptions extends RequestOptions {\n query?: QueryParams;\n body?: unknown;\n}\n\nexport interface HttpClient {\n request<T>(\n method: HttpMethod,\n path: string,\n options?: HttpRequestOptions\n ): Promise<T>;\n /**\n * PUT bytes straight to an absolute upload URL with the exact headers issued\n * for it. Skips the base URL, auth, and retries — the URL is single-use and\n * pre-authorized, and the body is not safe to replay.\n */\n upload(\n url: string,\n options: { headers: Record<string, string>; body: BodyInit; timeoutMs?: number; signal?: AbortSignal }\n ): Promise<void>;\n}\n\nfunction buildUrl(baseUrl: string, path: string, query?: QueryParams): string {\n const normalizedBase = baseUrl.replace(/\\/+$/, '');\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n const url = new URL(`${normalizedBase}${normalizedPath}`);\n\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null) {\n continue;\n }\n url.searchParams.set(key, String(value));\n }\n }\n\n return url.toString();\n}\n\nfunction mergeHeaders(\n base: Record<string, string>,\n extra?: Record<string, string>\n): Record<string, string> {\n return { ...base, ...(extra || {}) };\n}\n\nfunction hasHeader(headers: Record<string, string>, name: string): boolean {\n const target = name.toLowerCase();\n return Object.keys(headers).some((key) => key.toLowerCase() === target);\n}\n\nfunction isFormData(body: unknown): body is FormData {\n return typeof FormData !== 'undefined' && body instanceof FormData;\n}\n\nfunction prepareBody(body: unknown, headers: Record<string, string>): BodyInit | undefined {\n if (body === undefined || body === null) {\n return undefined;\n }\n\n if (isFormData(body) || body instanceof URLSearchParams) {\n return body as BodyInit;\n }\n\n if (typeof body === 'string' || body instanceof Blob || body instanceof ArrayBuffer) {\n return body as BodyInit;\n }\n\n if (!hasHeader(headers, 'content-type')) {\n headers['content-type'] = 'application/json';\n }\n\n return JSON.stringify(body);\n}\n\nasync function parseResponseBody(response: Response): Promise<{\n text: string | null;\n json: unknown;\n}> {\n const text = await response.text();\n if (!text) {\n return { text: null, json: undefined };\n }\n\n try {\n return { text, json: JSON.parse(text) };\n } catch {\n return { text, json: undefined };\n }\n}\n\nfunction createAbortController(\n timeoutMs: number,\n signal?: AbortSignal\n): { controller: AbortController; cleanup: () => void; timedOut: () => boolean } {\n const controller = new AbortController();\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let didTimeOut = false;\n\n if (signal) {\n if (signal.aborted) {\n controller.abort();\n } else {\n signal.addEventListener(\n 'abort',\n () => {\n controller.abort();\n },\n { once: true }\n );\n }\n }\n\n if (timeoutMs > 0) {\n timeoutId = setTimeout(() => {\n didTimeOut = true;\n controller.abort();\n }, timeoutMs);\n }\n\n return {\n controller,\n cleanup: () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n },\n timedOut: () => didTimeOut,\n };\n}\n\nfunction shouldRetryRequest(method: HttpMethod, status: number | undefined): boolean {\n if (status === undefined) {\n return false;\n }\n\n if (!isRetryableStatus(status)) {\n return false;\n }\n\n if (isIdempotentMethod(method)) {\n return true;\n }\n\n return false;\n}\n\nexport function createHttpClient(options: ClientOptions): HttpClient {\n const apiKey = resolveApiKey(options);\n const baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n const clientTimeoutMs = options.timeoutMs;\n const maxRetries = options.maxRetries ?? RETRY_CONFIG.MAX_RETRIES;\n const retryBaseDelayMs = options.retryBaseDelayMs ?? RETRY_CONFIG.BASE_DELAY;\n const retryMaxDelayMs = options.retryMaxDelayMs ?? RETRY_CONFIG.MAX_DELAY;\n const fetchImpl = options.fetch ?? fetch;\n const clientFetchOptions = options.fetchOptions ?? {};\n\n return {\n async request<T>(\n method: HttpMethod,\n path: string,\n requestOptions: HttpRequestOptions = {}\n ) {\n const url = buildUrl(baseUrl, path, requestOptions.query);\n const headers = mergeHeaders(\n {\n accept: 'application/json',\n authorization: `Bearer ${apiKey}`,\n 'user-agent': SDK_USER_AGENT,\n },\n requestOptions.headers\n );\n\n const body = prepareBody(requestOptions.body, headers);\n const requestTimeoutMs = requestOptions.timeoutMs ?? clientTimeoutMs ?? TIMEOUTS.HTTP_REQUEST;\n const requestMaxRetries = requestOptions.maxRetries ?? maxRetries;\n\n for (let attempt = 0; attempt <= requestMaxRetries; attempt += 1) {\n const { controller, cleanup, timedOut } = createAbortController(\n requestTimeoutMs,\n requestOptions.signal\n );\n\n try {\n const response = await fetchImpl(url, {\n ...clientFetchOptions,\n ...(requestOptions.fetchOptions ?? {}),\n method,\n headers,\n body,\n signal: controller.signal,\n });\n\n cleanup();\n\n const { text, json } = await parseResponseBody(response);\n\n if (!response.ok) {\n if (\n attempt < requestMaxRetries &&\n shouldRetryRequest(method, response.status)\n ) {\n const retryAfterMs = parseRetryAfterMs(response);\n const delayMs =\n retryAfterMs ??\n getRetryDelayMs(attempt, retryBaseDelayMs, retryMaxDelayMs);\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n continue;\n }\n\n throw errorFromResponse(response, text, json);\n }\n\n return (json ?? text) as T;\n } catch (error) {\n cleanup();\n\n if (timedOut()) {\n if (attempt < requestMaxRetries && isIdempotentMethod(method)) {\n const delayMs = getRetryDelayMs(\n attempt,\n retryBaseDelayMs,\n retryMaxDelayMs\n );\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n continue;\n }\n\n throw new TimeoutError('Request timed out');\n }\n\n if (requestOptions.signal?.aborted) {\n throw new RunApiError('Request aborted', { cause: error as Error });\n }\n\n if (error instanceof RunApiError) {\n throw error;\n }\n\n if (attempt < requestMaxRetries && isIdempotentMethod(method)) {\n const delayMs = getRetryDelayMs(\n attempt,\n retryBaseDelayMs,\n retryMaxDelayMs\n );\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n continue;\n }\n\n throw new NetworkError('Network error', { cause: error as Error });\n }\n }\n\n // Unreachable at runtime, but required for TypeScript return type inference\n throw new NetworkError('Network error');\n },\n\n async upload(url, uploadOptions) {\n const timeoutMs = uploadOptions.timeoutMs ?? clientTimeoutMs ?? TIMEOUTS.HTTP_REQUEST;\n const { controller, cleanup, timedOut } = createAbortController(timeoutMs, uploadOptions.signal);\n\n try {\n const response = await fetchImpl(url, {\n ...clientFetchOptions,\n method: 'PUT',\n headers: uploadOptions.headers,\n body: uploadOptions.body,\n signal: controller.signal,\n });\n cleanup();\n\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new RunApiError(`Direct upload failed with status ${response.status}${text ? `: ${text}` : ''}`);\n }\n } catch (error) {\n cleanup();\n if (timedOut()) {\n throw new TimeoutError('Direct upload timed out');\n }\n if (error instanceof RunApiError) {\n throw error;\n }\n throw new NetworkError('Direct upload network error', { cause: error as Error });\n }\n },\n };\n}\n","export function compactParams<T extends object>(params: T): Partial<T> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined || value === null) continue;\n if (typeof value === 'string' && value.trim() === '') continue;\n result[key] = value;\n }\n return result as Partial<T>;\n}\n","import { ValidationError } from './errors';\n\n/** One action entry from a package's generated contract. */\nexport interface ActionSchema {\n models?: readonly string[];\n rules?: readonly Record<string, any>[];\n fields_by_model?: Record<string, Record<string, any>>;\n}\n\ntype Params = Record<string, unknown>;\n\n/**\n * Validates request params against a generated action schema: model\n * membership, then declared cross-field rules, then per-field\n * required/enum/integer/min/max/length. A missing schema is a no-op.\n */\nexport function validateParams(schema: ActionSchema | undefined, params: Params): void {\n if (!schema) return;\n\n const model = params['model'];\n const models = schema.models ?? [];\n let fields: Record<string, any>;\n if (models.length === 0) {\n fields = schema.fields_by_model?.['_'] ?? {};\n } else {\n if (typeof model !== 'string' || !models.includes(model)) {\n const sorted = [...models].sort();\n throw new ValidationError(`model must be one of: ${sorted.join(', ')}`);\n }\n\n fields = schema.fields_by_model?.[model] ?? {};\n }\n\n const rules = schema.rules;\n if (Array.isArray(rules)) {\n for (const rule of rules) enforceContractRule(params, rule);\n }\n\n const keys = Object.keys(fields).sort();\n for (const field of keys) {\n validateSchemaField(params, field, fields[field]);\n }\n}\n\nfunction validateSchemaField(params: Params, field: string, rules: Record<string, any>): void {\n const value = params[field];\n if (value != null && ('min_items' in rules || 'max_items' in rules)) {\n validateSchemaItemCount(field, value, rules);\n }\n\n const present = fieldPresent(params, field);\n if (rules.required && !present) {\n throw new ValidationError(`${field} is required`);\n }\n if (!present) return;\n\n if (rules.enum !== undefined && !enumValueAllowed(rules.enum, value)) {\n throw new ValidationError(`${field} must be one of: ${formatEnumValues(rules.enum)}`);\n }\n\n if (rules.type === 'integer') {\n validateSchemaInteger(field, value, rules);\n }\n\n if ('min' in rules || 'max' in rules) {\n validateSchemaRange(field, value, rules);\n }\n}\n\nfunction validateSchemaItemCount(field: string, value: unknown, rules: Record<string, any>): void {\n if (!Array.isArray(value)) {\n throw new ValidationError(`${field} must be an array`);\n }\n\n const min = rules.min_items;\n const max = rules.max_items;\n if ((min == null || value.length >= min) && (max == null || value.length <= max)) return;\n throw new ValidationError(itemCountMessage(field, min, max));\n}\n\nfunction itemCountMessage(field: string, min: unknown, max: unknown): string {\n if (min != null && max != null) {\n return `${field} must contain between ${formatValue(min)} and ${formatValue(max)} items`;\n }\n if (min != null) {\n return `${field} must contain at least ${formatValue(min)} items`;\n }\n return `${field} must contain at most ${formatValue(max)} items`;\n}\n\n// Mirrors GatewayEntry#validate_schema_integer!: a type: integer field rejects\n// non-integer numbers (e.g. 11.5), which min/max alone admit. JS has no integer\n// type, so whole-valued floats count — they serialize to an integer on the wire.\nfunction validateSchemaInteger(field: string, value: unknown, rules: Record<string, any>): void {\n if (typeof value === 'number' && Number.isInteger(value)) return;\n const detail =\n rules.min != null && rules.max != null\n ? ` between ${formatValue(rules.min)} and ${formatValue(rules.max)}`\n : '';\n throw new ValidationError(`${field} must be an integer${detail}`);\n}\n\nfunction validateSchemaRange(field: string, value: unknown, rules: Record<string, any>): void {\n let measured: number;\n let unit: string | null;\n if (rules.length) {\n measured = [...String(value)].length;\n unit = 'characters';\n } else {\n if (typeof value !== 'number') {\n throw new ValidationError(`${field} must be a number`);\n }\n measured = value;\n unit = null;\n }\n\n const min = rules.min;\n const max = rules.max;\n if ((min == null || measured >= min) && (max == null || measured <= max)) return;\n throw new ValidationError(rangeMessage(field, min, max, unit));\n}\n\nfunction rangeMessage(field: string, min: unknown, max: unknown, unit: string | null): string {\n const suffix = unit ? ` ${unit}` : '';\n if (min != null && max != null) {\n return `${field} must be between ${formatValue(min)} and ${formatValue(max)}${suffix}`;\n }\n if (min != null) {\n return `${field} must be at least ${formatValue(min)}${suffix}`;\n }\n return `${field} must be at most ${formatValue(max)}${suffix}`;\n}\n\nfunction enumValueAllowed(enumValues: readonly unknown[], value: unknown): boolean {\n const valueIsNum = typeof value === 'number';\n for (const allowed of enumValues) {\n const allowedIsNum = typeof allowed === 'number';\n if (allowedIsNum) {\n if (valueIsNum && value === allowed) return true;\n } else if (valueIsNum) {\n // allowed non-numeric while value is numeric never matches.\n } else if (String(allowed) === String(value)) {\n return true;\n }\n }\n return false;\n}\n\nfunction enforceContractRule(params: Params, rule: Record<string, any>): void {\n const conditions: Record<string, unknown> = rule.when ?? {};\n const keys = Object.keys(conditions);\n for (const key of keys) {\n if (!ruleConditionMet(params, key, conditions[key])) return;\n }\n\n const context = keys.map((key) => `${key} is ${formatValue(conditions[key])}`).join(' and ');\n for (const field of rule.required ?? []) {\n if (!fieldPresent(params, field)) {\n throw new ValidationError(`${field} is required when ${context}`);\n }\n }\n for (const field of rule.forbidden ?? []) {\n if (fieldPresent(params, field)) {\n throw new ValidationError(`${field} is not allowed when ${context}`);\n }\n }\n}\n\nfunction ruleConditionMet(params: Params, field: string, value: unknown): boolean {\n if (!(field in params)) return false;\n return String(params[field]) === String(value);\n}\n\nfunction fieldPresent(params: Params, field: string): boolean {\n if (!(field in params)) return false;\n const value = params[field];\n if (value === false) return true;\n if (Array.isArray(value)) return value.some(presentValue);\n return presentValue(value);\n}\n\nfunction presentValue(value: unknown): boolean {\n if (value === null || value === undefined || value === false) return false;\n if (value === true) return true;\n if (typeof value === 'string') return value.trim() !== '';\n if (Array.isArray(value)) return value.length > 0;\n if (typeof value === 'object') return Object.keys(value).length > 0;\n return true;\n}\n\nfunction formatValue(value: unknown): string {\n return typeof value === 'string' ? value : String(value);\n}\n\n// JS collapses float literals (0.0 -> 0), losing the float type the other SDKs\n// keep. When an enum has a fractional member it is a float enum, so render its\n// whole-number members with a trailing .0 to match the gateway/Go/Ruby/Python\n// message text (e.g. \"0.0, 0.5, 1.0\", not \"0, 0.5, 1\").\nfunction formatEnumValues(values: readonly unknown[]): string {\n const floatEnum = values.some((v) => typeof v === 'number' && !Number.isInteger(v));\n return values\n .map((v) => (floatEnum && typeof v === 'number' ? formatFloat(v) : formatValue(v)))\n .join(', ');\n}\n\nfunction formatFloat(value: number): string {\n const text = String(value);\n return /[.eE]/.test(text) ? text : `${text}.0`;\n}\n","// RFC 1321 MD5 over raw bytes, returning the Base64 of the 16-byte digest — the\n// value the upload target expects as the Content-MD5 header on a direct-upload\n// PUT. Web Crypto has no MD5, so direct upload needs this pure implementation to\n// run in browsers as well as Node.\n\nconst SHIFTS = [\n 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,\n 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,\n 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,\n 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21,\n];\n\nconst K = Array.from({ length: 64 }, (_v, i) =>\n Math.floor(Math.abs(Math.sin(i + 1)) * 4294967296),\n);\n\nfunction add32(a: number, b: number): number {\n return (a + b) & 0xffffffff;\n}\n\nfunction rotl(value: number, bits: number): number {\n return (value << bits) | (value >>> (32 - bits));\n}\n\nfunction md5Bytes(input: Uint8Array): Uint8Array {\n const withOne = input.length + 1;\n const totalLen = withOne + ((56 - (withOne % 64) + 64) % 64) + 8;\n const msg = new Uint8Array(totalLen);\n msg.set(input);\n msg[input.length] = 0x80;\n\n const view = new DataView(msg.buffer);\n const bitLen = input.length * 8;\n view.setUint32(totalLen - 8, bitLen >>> 0, true);\n view.setUint32(totalLen - 4, Math.floor(bitLen / 0x100000000) >>> 0, true);\n\n let a0 = 0x67452301;\n let b0 = 0xefcdab89;\n let c0 = 0x98badcfe;\n let d0 = 0x10325476;\n\n const m = new Int32Array(16);\n for (let offset = 0; offset < totalLen; offset += 64) {\n for (let j = 0; j < 16; j += 1) {\n m[j] = view.getUint32(offset + j * 4, true);\n }\n\n let a = a0;\n let b = b0;\n let c = c0;\n let d = d0;\n\n for (let i = 0; i < 64; i += 1) {\n let f: number;\n let g: number;\n if (i < 16) {\n f = (b & c) | (~b & d);\n g = i;\n } else if (i < 32) {\n f = (d & b) | (~d & c);\n g = (5 * i + 1) % 16;\n } else if (i < 48) {\n f = b ^ c ^ d;\n g = (3 * i + 5) % 16;\n } else {\n f = c ^ (b | ~d);\n g = (7 * i) % 16;\n }\n\n f = add32(add32(f, a), add32(K[i], m[g]));\n a = d;\n d = c;\n c = b;\n b = add32(b, rotl(f, SHIFTS[i]));\n }\n\n a0 = add32(a0, a);\n b0 = add32(b0, b);\n c0 = add32(c0, c);\n d0 = add32(d0, d);\n }\n\n const out = new Uint8Array(16);\n const outView = new DataView(out.buffer);\n outView.setUint32(0, a0 >>> 0, true);\n outView.setUint32(4, b0 >>> 0, true);\n outView.setUint32(8, c0 >>> 0, true);\n outView.setUint32(12, d0 >>> 0, true);\n return out;\n}\n\nconst BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n let out = '';\n for (let i = 0; i < bytes.length; i += 3) {\n const b0 = bytes[i];\n const b1 = i + 1 < bytes.length ? bytes[i + 1] : 0;\n const b2 = i + 2 < bytes.length ? bytes[i + 2] : 0;\n out += BASE64_CHARS[b0 >> 2];\n out += BASE64_CHARS[((b0 & 3) << 4) | (b1 >> 4)];\n out += i + 1 < bytes.length ? BASE64_CHARS[((b1 & 15) << 2) | (b2 >> 6)] : '=';\n out += i + 2 < bytes.length ? BASE64_CHARS[b2 & 63] : '=';\n }\n return out;\n}\n\nexport function md5Base64(bytes: Uint8Array): string {\n return bytesToBase64(md5Bytes(bytes));\n}\n","import type { HttpClient } from './http';\nimport type { RequestOptions } from './types';\nimport { compactParams } from './params';\nimport { md5Base64 } from './md5';\n\nconst ENDPOINT = '/api/v1/files';\nconst PREPARE_ENDPOINT = `${ENDPOINT}/prepare`;\nconst CONFIRM_ENDPOINT = `${ENDPOINT}/confirm`;\n\ninterface PrepareResponse {\n signed_id: string;\n upload_url: string;\n headers: Record<string, string>;\n}\n\nexport interface FileUploadResponse {\n file_name: string;\n url: string;\n size_bytes: number;\n mime_type: string;\n created_at: string;\n expires_at: string;\n}\n\nexport type FileSource =\n | { type: 'url'; url: string }\n | { type: 'base64'; data: string };\n\nexport type FileCreateParams =\n | {\n file: Blob;\n file_name?: string;\n source?: never;\n }\n | {\n source: FileSource;\n file_name?: string;\n file?: never;\n };\n\nexport class Files {\n constructor(private readonly http: HttpClient) {}\n\n async create(params: FileCreateParams, options?: RequestOptions): Promise<FileUploadResponse> {\n const rawParams = params as { file?: Blob; source?: FileSource; file_name?: string };\n const hasFile = Boolean(rawParams.file);\n const hasSource = Boolean(rawParams.source);\n if (Number(hasFile) + Number(hasSource) !== 1) {\n throw new Error('Exactly one source is required: file or source');\n }\n\n if (hasFile) {\n return this.uploadDirect(rawParams.file as Blob, params.file_name, options);\n }\n\n return this.http.request<FileUploadResponse>('POST', ENDPOINT, {\n body: compactParams(params),\n ...options,\n });\n }\n\n // Local files upload straight to storage: ask for a pre-authorized target,\n // PUT the bytes there (never through the API), then confirm. The caller still\n // sees a single create() call.\n private async uploadDirect(\n file: Blob,\n fileName: string | undefined,\n options?: RequestOptions,\n ): Promise<FileUploadResponse> {\n const bytes = new Uint8Array(await file.arrayBuffer());\n const filename = fileName ?? (file as { name?: string }).name ?? 'upload';\n const contentType = file.type || 'application/octet-stream';\n\n const prepared = await this.http.request<PrepareResponse>('POST', PREPARE_ENDPOINT, {\n body: {\n filename,\n byte_size: bytes.byteLength,\n checksum: md5Base64(bytes),\n content_type: contentType,\n },\n ...options,\n });\n\n await this.http.upload(prepared.upload_url, {\n headers: prepared.headers,\n body: bytes,\n timeoutMs: options?.timeoutMs,\n signal: options?.signal,\n });\n\n return this.http.request<FileUploadResponse>('POST', CONFIRM_ENDPOINT, {\n body: { signed_id: prepared.signed_id },\n ...options,\n });\n }\n}\n","import type { HttpClient } from './http';\nimport type { RequestOptions } from './types';\n\nconst INFO_ENDPOINT = '/api/v1/me';\nconst BALANCE_ENDPOINT = '/api/v1/me/balance';\n\nexport interface AccountInfoResponse {\n id: number;\n name: string;\n email: string;\n account: {\n id: number;\n name: string;\n };\n}\n\nexport interface AccountBalanceResponse {\n balance_cents: number;\n paid_balance_cents: number;\n bonus_balance_cents: number;\n spent_cents_today: number;\n spent_cents_total: number;\n}\n\nexport class Account {\n constructor(private readonly http: HttpClient) {}\n\n async info(options?: RequestOptions): Promise<AccountInfoResponse> {\n return this.http.request<AccountInfoResponse>('GET', INFO_ENDPOINT, { ...options });\n }\n\n async balance(options?: RequestOptions): Promise<AccountBalanceResponse> {\n return this.http.request<AccountBalanceResponse>('GET', BALANCE_ENDPOINT, { ...options });\n }\n}\n","import { createHttpClient, type HttpClient } from './http';\nimport { resolveApiKey } from './auth';\nimport type { ClientOptions } from './types';\nimport { Files } from './files';\nimport { Account } from './account';\n\n/**\n * Base class for every RunAPI client. Resolves the API key, builds the shared\n * HTTP client, and exposes the Universal Resources (file upload, account) that\n * are available on any client regardless of which model package was imported.\n *\n * Provider clients extend this and build their model resources from `this.http`.\n */\nexport class BaseClient {\n /** Temporary file upload operations. */\n public readonly files: Files;\n /** Account info and balance operations. */\n public readonly account: Account;\n\n protected readonly http: HttpClient;\n private readonly apiKey: string;\n\n constructor(options: ClientOptions = {}) {\n this.apiKey = resolveApiKey(options);\n this.http = createHttpClient(options);\n this.files = new Files(this.http);\n this.account = new Account(this.http);\n }\n\n getApiKey() {\n return this.apiKey;\n }\n}\n","// Types\nexport type {\n HttpMethod,\n QueryParams,\n ClientOptions,\n RequestOptions,\n PollingOptions,\n TaskStatus,\n AsyncTaskStatus,\n TaskResponse,\n} from './types';\n\n// Constants\nexport { TIMEOUTS, RETRY_CONFIG, DEFAULT_BASE_URL, SDK_USER_AGENT } from './constants';\n\n// Errors\nexport {\n RunApiError,\n AuthenticationError,\n RateLimitError,\n InsufficientCreditsError,\n NotFoundError,\n ValidationError,\n ServiceUnavailableError,\n NetworkError,\n TimeoutError,\n TaskTimeoutError,\n TaskFailedError,\n errorFromResponse,\n} from './errors';\nexport type { RunApiErrorOptions } from './errors';\n\n// Auth\nexport { resolveApiKey } from './auth';\n\n// HTTP Client\nexport { createHttpClient } from './http';\nexport type { HttpClient, HttpRequestOptions } from './http';\n\n// Retry (高级用户可用)\nexport {\n getRetryDelayMs,\n isRetryableStatus,\n isIdempotentMethod,\n parseRetryAfterMs,\n} from './retry';\nexport type { RetryOptions } from './retry';\n\n// Params\nexport { compactParams } from './params';\n\n// Contract validation\nexport { validateParams } from './validate';\nexport type { ActionSchema } from './validate';\n\n// Files\nexport { Files } from './files';\nexport type { FileCreateParams, FileSource, FileUploadResponse } from './files';\n\n// Account\nexport { Account } from './account';\nexport type { AccountInfoResponse, AccountBalanceResponse } from './account';\n\n// Base client\nexport { BaseClient } from './base-client';\n\n// Version\nexport const version = '0.1.0';\n\n// Note: pollUntilComplete 不从主入口导出,避免 PollingOptions 类型暴露\n// 各 API 包(suno/veo-3-1 等)通过 '@runapi.ai/core/internal' 导入\n"],"mappings":"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","names":[]} |
+1
-1
@@ -6,3 +6,3 @@ { | ||
| }, | ||
| "version": "0.2.13", | ||
| "version": "0.2.14", | ||
| "description": "RunAPI core SDK for JavaScript, Python, Ruby, Go, Java, and PHP", | ||
@@ -9,0 +9,0 @@ "main": "./dist/index.js", |
243809
2.02%2539
1.68%