@neatsuite/http
Version:
A TypeScript-first NetSuite API client with built-in OAuth 1.0a authentication, retry logic, and performance monitoring
1 lines • 43.2 kB
Source Map (JSON)
{"version":3,"sources":["../src/types.ts","../src/client.ts","../src/utils.ts"],"names":["response"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\r\n * NetSuite API Client Types\r\n * @module @neatsuite/http\r\n */\r\n\r\nimport { AxiosRequestConfig, AxiosResponse } from 'axios';\r\n\r\n/**\r\n * OAuth 1.0a configuration for NetSuite\r\n */\r\nexport interface NetSuiteOAuthConfig {\r\n consumerKey: string;\r\n consumerSecret: string;\r\n tokenKey: string;\r\n tokenSecret: string;\r\n realm: string;\r\n}\r\n\r\n/**\r\n * NetSuite client configuration\r\n */\r\nexport interface NetSuiteConfig {\r\n /** OAuth 1.0a configuration */\r\n oauth: NetSuiteOAuthConfig;\r\n /** NetSuite account URL ID (e.g., \"1234567\") */\r\n accountId: string;\r\n /** Optional timeout in milliseconds (default: 15000) */\r\n timeout?: number;\r\n /** Optional number of retry attempts (default: 3) */\r\n retries?: number;\r\n /** Optional custom headers */\r\n headers?: Record<string, string>;\r\n /** Enable performance logging (default: false) */\r\n enablePerformanceLogging?: boolean;\r\n}\r\n\r\n/**\r\n * HTTP methods supported by the client\r\n */\r\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\r\n\r\n/**\r\n * Request options for NetSuite API calls\r\n */\r\nexport interface NetSuiteRequestOptions {\r\n /** Full NetSuite API URL */\r\n url: string;\r\n /** HTTP method */\r\n method?: HttpMethod;\r\n /** Request body for POST/PUT/PATCH requests */\r\n body?: any;\r\n /** Additional headers for this request */\r\n headers?: Record<string, string>;\r\n /** Override retries for this request */\r\n retries?: number;\r\n /** Custom axios config options */\r\n axiosConfig?: Partial<AxiosRequestConfig>;\r\n}\r\n\r\n/**\r\n * Response from NetSuite API\r\n */\r\nexport interface NetSuiteResponse<T = any> {\r\n /** Response data */\r\n data: T;\r\n /** HTTP status code */\r\n status: number;\r\n /** Response headers */\r\n headers: Record<string, string>;\r\n /** Request duration in milliseconds */\r\n duration: number;\r\n}\r\n\r\n/**\r\n * NetSuite RESTlet parameters\r\n */\r\nexport interface NetSuiteRestletParams {\r\n /** Script ID */\r\n script: string | number;\r\n /** Deploy ID */\r\n deploy: string | number;\r\n /** Additional query parameters */\r\n params?: Record<string, string | number | boolean>;\r\n}\r\n\r\n/**\r\n * Performance measurement result\r\n */\r\nexport interface PerformanceResult<T> {\r\n result: T;\r\n duration: number;\r\n}\r\n\r\n/**\r\n * NetSuite error response\r\n */\r\nexport interface NetSuiteErrorResponse {\r\n type?: string;\r\n title?: string;\r\n status?: number;\r\n detail?: string;\r\n 'o:errorDetails'?: Array<{\r\n detail?: string;\r\n 'o:errorCode'?: string;\r\n }>;\r\n}\r\n\r\n/**\r\n * Custom error class for NetSuite API errors\r\n */\r\nexport class NetSuiteError extends Error {\r\n public readonly status?: number;\r\n public readonly code?: string;\r\n public readonly details?: NetSuiteErrorResponse;\r\n public readonly response?: AxiosResponse;\r\n\r\n constructor(\r\n message: string,\r\n status?: number,\r\n code?: string,\r\n details?: NetSuiteErrorResponse,\r\n response?: AxiosResponse\r\n ) {\r\n super(message);\r\n this.name = 'NetSuiteError';\r\n this.status = status;\r\n this.code = code;\r\n this.details = details;\r\n this.response = response;\r\n \r\n // Maintains proper stack trace for where our error was thrown\r\n Error.captureStackTrace(this, NetSuiteError);\r\n }\r\n}\r\n\r\n/**\r\n * Options for retry behavior\r\n */\r\nexport interface RetryOptions {\r\n /** Number of retry attempts */\r\n retries: number;\r\n /** Minimum timeout between retries in ms */\r\n minTimeout?: number;\r\n /** Maximum timeout between retries in ms */\r\n maxTimeout?: number;\r\n /** Factor to multiply timeout by for each retry */\r\n factor?: number;\r\n /** Randomize timeout between retries */\r\n randomize?: boolean;\r\n /** Custom function to determine if retry should happen */\r\n shouldRetry?: (error: any) => boolean;\r\n /** Callback on failed attempt */\r\n onFailedAttempt?: (error: any) => void;\r\n}\r\n\r\n/**\r\n * Cache options for responses\r\n */\r\nexport interface CacheOptions {\r\n /** Cache TTL in seconds */\r\n ttl?: number;\r\n /** Key for caching */\r\n key?: string;\r\n /** Whether to use cache */\r\n enabled?: boolean;\r\n}\r\n\r\n/**\r\n * Request context for middleware\r\n */\r\nexport interface RequestContext {\r\n /** Request configuration */\r\n config: NetSuiteRequestOptions;\r\n /** OAuth headers */\r\n authHeaders: Record<string, string>;\r\n /** Start time of request */\r\n startTime: number;\r\n}\r\n\r\n/**\r\n * Middleware function type\r\n */\r\nexport type Middleware = (\r\n context: RequestContext,\r\n next: () => Promise<AxiosResponse>\r\n) => Promise<AxiosResponse>;\r\n\r\n/**\r\n * Logger interface for custom logging\r\n */\r\nexport interface Logger {\r\n debug: (message: string, meta?: any) => void;\r\n info: (message: string, meta?: any) => void;\r\n warn: (message: string, meta?: any) => void;\r\n error: (message: string, meta?: any) => void;\r\n} ","/**\r\n * NetSuite API Client\r\n * @module @neatsuite/http\r\n */\r\n\r\nimport axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';\r\nimport OAuth from 'oauth-1.0a';\r\nimport crypto from 'crypto';\r\nlet pRetry: any;\r\n\r\nimport('p-retry').then((module) => {\r\n pRetry = module;\r\n});\r\n\r\nimport http from 'http';\r\nimport https from 'https';\r\nimport {\r\n NetSuiteConfig,\r\n NetSuiteRequestOptions,\r\n NetSuiteResponse,\r\n NetSuiteRestletParams,\r\n NetSuiteError,\r\n NetSuiteErrorResponse,\r\n PerformanceResult,\r\n HttpMethod,\r\n Middleware,\r\n Logger,\r\n RetryOptions\r\n} from './types';\r\n\r\n/**\r\n * NetSuite API Client\r\n * \r\n * @example\r\n * ```typescript\r\n * import { NetSuiteClient } from '@neatsuite/http';\r\n * \r\n * const client = new NetSuiteClient({\r\n * oauth: {\r\n * consumerKey: 'your-consumer-key',\r\n * consumerSecret: 'your-consumer-secret',\r\n * tokenKey: 'your-token-key',\r\n * tokenSecret: 'your-token-secret',\r\n * realm: 'your-realm'\r\n * },\r\n * accountId: 'your-account-id'\r\n * });\r\n * \r\n * // Make a RESTlet call\r\n * const response = await client.restlet({\r\n * script: '123',\r\n * deploy: '1',\r\n * params: { customParam: 'value' }\r\n * });\r\n * ```\r\n */\r\nexport class NetSuiteClient {\r\n private config: NetSuiteConfig;\r\n private oauth: OAuth;\r\n private axiosInstance: AxiosInstance;\r\n private middlewares: Middleware[] = [];\r\n private logger?: Logger;\r\n\r\n constructor(config: NetSuiteConfig, logger?: Logger) {\r\n this.config = {\r\n timeout: 15000,\r\n retries: 3,\r\n enablePerformanceLogging: false,\r\n ...config\r\n };\r\n\r\n this.logger = logger;\r\n\r\n // Initialize OAuth\r\n this.oauth = new OAuth({\r\n consumer: {\r\n key: config.oauth.consumerKey,\r\n secret: config.oauth.consumerSecret\r\n },\r\n signature_method: 'HMAC-SHA256',\r\n hash_function: (base_string: string, key: string) => {\r\n return crypto\r\n .createHmac('sha256', key)\r\n .update(base_string)\r\n .digest('base64');\r\n },\r\n realm: config.oauth.realm\r\n });\r\n\r\n // Create axios instance with optimized configuration\r\n this.axiosInstance = axios.create({\r\n timeout: this.config.timeout,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Accept-Encoding': 'gzip, deflate',\r\n ...this.config.headers\r\n },\r\n httpAgent: new http.Agent({ keepAlive: true }),\r\n httpsAgent: new https.Agent({ keepAlive: true }),\r\n maxRedirects: 5,\r\n validateStatus: (status: number) => status < 500\r\n });\r\n\r\n // Add request/response interceptors for logging\r\n if (this.config.enablePerformanceLogging || logger) {\r\n this.setupInterceptors();\r\n }\r\n }\r\n\r\n /**\r\n * Add middleware to the request pipeline\r\n * @param middleware - Middleware function\r\n */\r\n public use(middleware: Middleware): void {\r\n this.middlewares.push(middleware);\r\n }\r\n\r\n /**\r\n * Setup axios interceptors for logging\r\n */\r\n private setupInterceptors(): void {\r\n // Request interceptor\r\n this.axiosInstance.interceptors.request.use(\r\n (config) => {\r\n if (this.logger) {\r\n this.logger.debug('NetSuite API Request', {\r\n method: config.method,\r\n url: config.url,\r\n headers: config.headers\r\n });\r\n }\r\n return config;\r\n },\r\n (error) => {\r\n if (this.logger) {\r\n this.logger.error('NetSuite API Request Error', { error });\r\n }\r\n return Promise.reject(error);\r\n }\r\n );\r\n\r\n // Response interceptor\r\n this.axiosInstance.interceptors.response.use(\r\n (response) => {\r\n if (this.logger) {\r\n this.logger.debug('NetSuite API Response', {\r\n status: response.status,\r\n url: response.config.url,\r\n duration: (response.config as any)?.metadata?.duration\r\n });\r\n }\r\n return response;\r\n },\r\n (error) => {\r\n if (this.logger) {\r\n this.logger.error('NetSuite API Response Error', {\r\n status: error.response?.status,\r\n url: error.config?.url,\r\n error: error.message\r\n });\r\n }\r\n return Promise.reject(error);\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Generate OAuth authorization header\r\n */\r\n private generateAuthHeader(url: string, method: HttpMethod): Record<string, string> {\r\n const request_data = { url, method };\r\n const token = {\r\n key: this.config.oauth.tokenKey,\r\n secret: this.config.oauth.tokenSecret\r\n };\r\n\r\n return this.oauth.toHeader(this.oauth.authorize(request_data, token)) as any;\r\n }\r\n\r\n /**\r\n * Measure performance of an operation\r\n */\r\n private async measurePerformance<T>(\r\n operation: string,\r\n fn: () => Promise<T>\r\n ): Promise<PerformanceResult<T>> {\r\n const startTime = Date.now();\r\n \r\n try {\r\n const result = await fn();\r\n const duration = Date.now() - startTime;\r\n \r\n if (this.config.enablePerformanceLogging) {\r\n this.logger?.info(`[Performance] ${operation} completed`, { duration });\r\n }\r\n \r\n return { result, duration };\r\n } catch (error) {\r\n const duration = Date.now() - startTime;\r\n this.logger?.error(`[Performance] ${operation} failed`, { duration, error });\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Execute middleware chain\r\n */\r\n private async executeMiddlewares(\r\n context: any,\r\n index: number,\r\n finalHandler: () => Promise<AxiosResponse>\r\n ): Promise<AxiosResponse> {\r\n if (index >= this.middlewares.length) {\r\n return finalHandler();\r\n }\r\n\r\n const middleware = this.middlewares[index];\r\n return middleware(context, () => \r\n this.executeMiddlewares(context, index + 1, finalHandler)\r\n );\r\n }\r\n\r\n /**\r\n * Make a request to NetSuite API\r\n * \r\n * @example\r\n * ```typescript\r\n * const response = await client.request({\r\n * url: 'https://account.restlets.api.netsuite.com/app/site/hosting/restlet.nl',\r\n * method: 'POST',\r\n * body: { action: 'search', query: 'customer' }\r\n * });\r\n * ```\r\n */\r\n public async request<T = any>(options: NetSuiteRequestOptions): Promise<NetSuiteResponse<T>> {\r\n const {\r\n url,\r\n method = 'GET',\r\n body = null,\r\n headers = {},\r\n retries = this.config.retries,\r\n axiosConfig = {}\r\n } = options;\r\n\r\n // Generate OAuth authorization header\r\n const authHeader = this.generateAuthHeader(url, method);\r\n\r\n // Prepare request configuration\r\n const requestConfig: AxiosRequestConfig & { metadata?: any } = {\r\n method,\r\n url,\r\n headers: {\r\n ...authHeader,\r\n ...headers\r\n },\r\n ...axiosConfig,\r\n metadata: {}\r\n };\r\n\r\n // Add body for non-GET requests\r\n if (body && ['POST', 'PUT', 'PATCH'].includes(method)) {\r\n requestConfig.data = body;\r\n }\r\n\r\n // Create retry options\r\n const retryOptions: RetryOptions = {\r\n retries: retries || 3,\r\n minTimeout: 1000,\r\n maxTimeout: 3000,\r\n shouldRetry: (error: any) => {\r\n // Don't retry on 4xx errors (client errors)\r\n if (error.response?.status >= 400 && error.response?.status < 500) {\r\n return false;\r\n }\r\n return true;\r\n },\r\n onFailedAttempt: (error: any) => {\r\n this.logger?.warn(`NetSuite API retry attempt`, {\r\n attemptNumber: error.attemptNumber,\r\n retriesLeft: error.retriesLeft\r\n });\r\n }\r\n };\r\n\r\n // Create the request function\r\n const makeRequest = async (): Promise<AxiosResponse> => {\r\n const startTime = Date.now();\r\n requestConfig.metadata.startTime = startTime;\r\n\r\n // Execute middleware chain\r\n const response = await this.executeMiddlewares(\r\n {\r\n config: options,\r\n authHeaders: authHeader,\r\n startTime\r\n },\r\n 0,\r\n () => this.axiosInstance(requestConfig)\r\n );\r\n\r\n requestConfig.metadata.duration = Date.now() - startTime;\r\n\r\n // Check for successful response\r\n if (response.status !== 200) {\r\n throw new NetSuiteError(\r\n `NetSuite API returned status ${response.status}`,\r\n response.status,\r\n 'HTTP_ERROR',\r\n response.data as NetSuiteErrorResponse,\r\n response\r\n );\r\n }\r\n\r\n return response;\r\n };\r\n\r\n // Make the request with retry logic\r\n const { result: response, duration }: { result: AxiosResponse, duration: number } = await this.measurePerformance(\r\n `NetSuite API ${method} ${url}`,\r\n () => pRetry(makeRequest, retryOptions as any)\r\n );\r\n\r\n return {\r\n data: response.data,\r\n status: response.status,\r\n headers: response.headers as Record<string, string>,\r\n duration\r\n };\r\n }\r\n\r\n /**\r\n * Build NetSuite RESTlet URL\r\n */\r\n private buildRestletUrl(params: NetSuiteRestletParams): string {\r\n const baseUrl = `https://${this.config.accountId}.restlets.api.netsuite.com/app/site/hosting/restlet.nl`;\r\n const queryParams = new URLSearchParams({\r\n script: params.script.toString(),\r\n deploy: params.deploy.toString(),\r\n ...params.params\r\n } as any);\r\n return `${baseUrl}?${queryParams.toString()}`;\r\n }\r\n\r\n /**\r\n * Make a RESTlet call\r\n * \r\n * @example\r\n * ```typescript\r\n * const response = await client.restlet({\r\n * script: '123',\r\n * deploy: '1',\r\n * params: { action: 'getCustomer', id: '456' }\r\n * });\r\n * ```\r\n */\r\n public async restlet<T = any>(\r\n params: NetSuiteRestletParams,\r\n options?: Partial<NetSuiteRequestOptions>\r\n ): Promise<NetSuiteResponse<T>> {\r\n const url = this.buildRestletUrl(params);\r\n return this.request<T>({\r\n url,\r\n ...options\r\n });\r\n }\r\n\r\n /**\r\n * GET request helper\r\n */\r\n public async get<T = any>(\r\n url: string,\r\n options?: Partial<NetSuiteRequestOptions>\r\n ): Promise<NetSuiteResponse<T>> {\r\n return this.request<T>({ ...options, url, method: 'GET' });\r\n }\r\n\r\n /**\r\n * POST request helper\r\n */\r\n public async post<T = any>(\r\n url: string,\r\n body?: any,\r\n options?: Partial<NetSuiteRequestOptions>\r\n ): Promise<NetSuiteResponse<T>> {\r\n return this.request<T>({ ...options, url, method: 'POST', body });\r\n }\r\n\r\n /**\r\n * PUT request helper\r\n */\r\n public async put<T = any>(\r\n url: string,\r\n body?: any,\r\n options?: Partial<NetSuiteRequestOptions>\r\n ): Promise<NetSuiteResponse<T>> {\r\n return this.request<T>({ ...options, url, method: 'PUT', body });\r\n }\r\n\r\n /**\r\n * PATCH request helper\r\n */\r\n public async patch<T = any>(\r\n url: string,\r\n body?: any,\r\n options?: Partial<NetSuiteRequestOptions>\r\n ): Promise<NetSuiteResponse<T>> {\r\n return this.request<T>({ ...options, url, method: 'PATCH', body });\r\n }\r\n\r\n /**\r\n * DELETE request helper\r\n */\r\n public async delete<T = any>(\r\n url: string,\r\n options?: Partial<NetSuiteRequestOptions>\r\n ): Promise<NetSuiteResponse<T>> {\r\n return this.request<T>({ ...options, url, method: 'DELETE' });\r\n }\r\n\r\n /**\r\n * Handle API errors\r\n */\r\n public static isNetSuiteError(error: any): error is NetSuiteError {\r\n return error instanceof NetSuiteError;\r\n }\r\n\r\n /**\r\n * Create error from axios error\r\n */\r\n public static createError(error: any): NetSuiteError {\r\n if (error.code === 'ECONNABORTED' || error.code === 'ETIMEDOUT') {\r\n return new NetSuiteError(\r\n 'Request timeout - NetSuite API is taking too long to respond',\r\n 504,\r\n 'TIMEOUT'\r\n );\r\n }\r\n\r\n if (error.response) {\r\n return new NetSuiteError(\r\n error.response.data?.detail || 'Error from NetSuite API',\r\n error.response.status,\r\n error.response.data?.['o:errorCode'],\r\n error.response.data,\r\n error.response\r\n );\r\n }\r\n\r\n return new NetSuiteError(\r\n error.message || 'Unknown error occurred',\r\n 500,\r\n 'UNKNOWN_ERROR'\r\n );\r\n }\r\n} ","/**\r\n * NetSuite API Utilities\r\n * @module @neatsuite/http\r\n */\r\n\r\nimport { NetSuiteError, NetSuiteResponse, CacheOptions } from './types';\r\n\r\n/**\r\n * Simple in-memory cache for API responses\r\n */\r\nexport class ResponseCache {\r\n private cache: Map<string, { data: any; expiry: number }> = new Map();\r\n\r\n /**\r\n * Get cached response\r\n */\r\n get<T>(key: string): T | null {\r\n const cached = this.cache.get(key);\r\n if (!cached) return null;\r\n\r\n if (Date.now() > cached.expiry) {\r\n this.cache.delete(key);\r\n return null;\r\n }\r\n\r\n return cached.data as T;\r\n }\r\n\r\n /**\r\n * Set cached response\r\n */\r\n set(key: string, data: any, ttl: number): void {\r\n this.cache.set(key, {\r\n data,\r\n expiry: Date.now() + (ttl * 1000)\r\n });\r\n }\r\n\r\n /**\r\n * Clear cache\r\n */\r\n clear(): void {\r\n this.cache.clear();\r\n }\r\n\r\n /**\r\n * Remove specific key\r\n */\r\n delete(key: string): boolean {\r\n return this.cache.delete(key);\r\n }\r\n}\r\n\r\n/**\r\n * Rate limiter for API calls\r\n */\r\nexport class RateLimiter {\r\n private requests: number[] = [];\r\n private maxRequests: number;\r\n private windowMs: number;\r\n\r\n constructor(maxRequests: number = 100, windowMs: number = 60000) {\r\n this.maxRequests = maxRequests;\r\n this.windowMs = windowMs;\r\n }\r\n\r\n /**\r\n * Check if request can be made\r\n */\r\n canMakeRequest(): boolean {\r\n const now = Date.now();\r\n this.requests = this.requests.filter(time => now - time < this.windowMs);\r\n return this.requests.length < this.maxRequests;\r\n }\r\n\r\n /**\r\n * Record a request\r\n */\r\n recordRequest(): void {\r\n this.requests.push(Date.now());\r\n }\r\n\r\n /**\r\n * Get remaining requests\r\n */\r\n getRemainingRequests(): number {\r\n const now = Date.now();\r\n this.requests = this.requests.filter(time => now - time < this.windowMs);\r\n return Math.max(0, this.maxRequests - this.requests.length);\r\n }\r\n\r\n /**\r\n * Get time until next request can be made\r\n */\r\n getTimeUntilNextRequest(): number {\r\n if (this.canMakeRequest()) return 0;\r\n \r\n const oldestRequest = Math.min(...this.requests);\r\n return Math.max(0, this.windowMs - (Date.now() - oldestRequest));\r\n }\r\n}\r\n\r\n/**\r\n * Batch multiple requests together\r\n */\r\nexport class RequestBatcher<T> {\r\n private batch: Array<{\r\n key: string;\r\n resolve: (value: T) => void;\r\n reject: (error: any) => void;\r\n }> = [];\r\n private batchTimeout?: NodeJS.Timeout;\r\n private batchSize: number;\r\n private batchDelay: number;\r\n private batchProcessor: (keys: string[]) => Promise<Map<string, T>>;\r\n\r\n constructor(\r\n batchProcessor: (keys: string[]) => Promise<Map<string, T>>,\r\n batchSize: number = 10,\r\n batchDelay: number = 50\r\n ) {\r\n this.batchProcessor = batchProcessor;\r\n this.batchSize = batchSize;\r\n this.batchDelay = batchDelay;\r\n }\r\n\r\n /**\r\n * Add request to batch\r\n */\r\n add(key: string): Promise<T> {\r\n return new Promise((resolve, reject) => {\r\n this.batch.push({ key, resolve, reject });\r\n\r\n if (this.batch.length >= this.batchSize) {\r\n this.processBatch();\r\n } else if (!this.batchTimeout) {\r\n this.batchTimeout = setTimeout(() => this.processBatch(), this.batchDelay);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Process the current batch\r\n */\r\n private async processBatch(): Promise<void> {\r\n if (this.batchTimeout) {\r\n clearTimeout(this.batchTimeout);\r\n this.batchTimeout = undefined;\r\n }\r\n\r\n const currentBatch = this.batch.splice(0, this.batchSize);\r\n if (currentBatch.length === 0) return;\r\n\r\n const keys = currentBatch.map(item => item.key);\r\n\r\n try {\r\n const results = await this.batchProcessor(keys);\r\n \r\n currentBatch.forEach(({ key, resolve, reject }) => {\r\n const result = results.get(key);\r\n if (result !== undefined) {\r\n resolve(result);\r\n } else {\r\n reject(new Error(`No result for key: ${key}`));\r\n }\r\n });\r\n } catch (error) {\r\n currentBatch.forEach(({ reject }) => reject(error));\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Retry with exponential backoff\r\n */\r\nexport async function retryWithBackoff<T>(\r\n fn: () => Promise<T>,\r\n options: {\r\n maxRetries?: number;\r\n initialDelay?: number;\r\n maxDelay?: number;\r\n factor?: number;\r\n onRetry?: (attempt: number, error: any) => void;\r\n } = {}\r\n): Promise<T> {\r\n const {\r\n maxRetries = 3,\r\n initialDelay = 1000,\r\n maxDelay = 30000,\r\n factor = 2,\r\n onRetry\r\n } = options;\r\n\r\n let lastError: any;\r\n \r\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\r\n try {\r\n return await fn();\r\n } catch (error) {\r\n lastError = error;\r\n \r\n if (attempt === maxRetries) {\r\n throw error;\r\n }\r\n\r\n if (onRetry) {\r\n onRetry(attempt + 1, error);\r\n }\r\n\r\n const delay = Math.min(\r\n initialDelay * Math.pow(factor, attempt),\r\n maxDelay\r\n );\r\n\r\n await new Promise(resolve => setTimeout(resolve, delay));\r\n }\r\n }\r\n\r\n throw lastError;\r\n}\r\n\r\n/**\r\n * Create a cache key from request options\r\n */\r\nexport function createCacheKey(\r\n url: string,\r\n method: string,\r\n params?: any\r\n): string {\r\n const sortedParams = params ? \r\n Object.keys(params).sort().reduce((acc, key) => {\r\n acc[key] = params[key];\r\n return acc;\r\n }, {} as any) : {};\r\n\r\n return `${method}:${url}:${JSON.stringify(sortedParams)}`;\r\n}\r\n\r\n/**\r\n * Parse NetSuite error response\r\n */\r\nexport function parseNetSuiteError(error: any): {\r\n message: string;\r\n code?: string;\r\n details?: any;\r\n} {\r\n if (NetSuiteError.prototype.isPrototypeOf(error)) {\r\n return {\r\n message: error.message,\r\n code: error.code,\r\n details: error.details\r\n };\r\n }\r\n\r\n if (error.response?.data) {\r\n const data = error.response.data;\r\n return {\r\n message: data.detail || data.message || 'NetSuite API error',\r\n code: data['o:errorCode'] || data.code,\r\n details: data['o:errorDetails'] || data\r\n };\r\n }\r\n\r\n return {\r\n message: error.message || 'Unknown error',\r\n code: error.code,\r\n details: error\r\n };\r\n}\r\n\r\n/**\r\n * Format NetSuite date\r\n */\r\nexport function formatNetSuiteDate(date: Date): string {\r\n return date.toISOString().split('T')[0];\r\n}\r\n\r\n/**\r\n * Parse NetSuite date\r\n */\r\nexport function parseNetSuiteDate(dateString: string): Date {\r\n return new Date(dateString + 'T00:00:00Z');\r\n}\r\n\r\n/**\r\n * Build query string for NetSuite searches\r\n */\r\nexport function buildSearchQuery(filters: Record<string, any>): string {\r\n return Object.entries(filters)\r\n .filter(([_, value]) => value !== null && value !== undefined)\r\n .map(([key, value]) => {\r\n if (Array.isArray(value)) {\r\n return `${key} IN (${value.map(v => `'${v}'`).join(',')})`;\r\n }\r\n if (typeof value === 'string') {\r\n return `${key} = '${value}'`;\r\n }\r\n return `${key} = ${value}`;\r\n })\r\n .join(' AND ');\r\n}\r\n\r\n/**\r\n * Sanitize NetSuite field values\r\n */\r\nexport function sanitizeFieldValue(value: any): any {\r\n if (value === null || value === undefined) {\r\n return '';\r\n }\r\n \r\n if (typeof value === 'string') {\r\n // Remove control characters and trim\r\n return value.replace(/[\\x00-\\x1F\\x7F]/g, '').trim();\r\n }\r\n \r\n if (Array.isArray(value)) {\r\n return value.map(sanitizeFieldValue);\r\n }\r\n \r\n if (typeof value === 'object') {\r\n const sanitized: any = {};\r\n for (const [key, val] of Object.entries(value)) {\r\n sanitized[key] = sanitizeFieldValue(val);\r\n }\r\n return sanitized;\r\n }\r\n \r\n return value;\r\n}\r\n\r\n/**\r\n * Convert NetSuite internal ID to string\r\n */\r\nexport function toInternalId(id: string | number): string {\r\n return String(id);\r\n}\r\n\r\n/**\r\n * Validate NetSuite configuration\r\n */\r\nexport function validateConfig(config: any): string[] {\r\n const errors: string[] = [];\r\n\r\n if (!config.oauth) {\r\n errors.push('OAuth configuration is required');\r\n } else {\r\n if (!config.oauth.consumerKey) errors.push('OAuth consumer key is required');\r\n if (!config.oauth.consumerSecret) errors.push('OAuth consumer secret is required');\r\n if (!config.oauth.tokenKey) errors.push('OAuth token key is required');\r\n if (!config.oauth.tokenSecret) errors.push('OAuth token secret is required');\r\n if (!config.oauth.realm) errors.push('OAuth realm is required');\r\n }\r\n\r\n if (!config.accountId) {\r\n errors.push('Account ID is required');\r\n }\r\n\r\n return errors;\r\n} "]}