{"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} "]}