{"version":3,"file":"sdk-error.mjs","sources":["../../../src/core/sdk-error.ts"],"sourcesContent":["export type SdkErrorDetails = {\n  code: string\n  /**\n   * Human-readable detail. **Never interpolate a caller-supplied value into\n   * this string** — request params, a filter, a URL, a token.\n   *\n   * `AjaxError` runs its `requestInfo` through `redactSensitiveParams` before\n   * storing it; `SdkError` has no equivalent step, because its description is\n   * expected to be written by the SDK rather than assembled from input. That\n   * expectation is the only thing keeping a credential out of it, and error\n   * messages travel — into logs, into failure reports, into Bitrix24 server-side\n   * records. A filter alone legitimately carries user data: the email or phone\n   * number being searched for.\n   */\n  description?: string\n  status: number\n  originalError?: unknown\n}\n\n/**\n * Error in Sdk\n */\nexport class SdkError extends Error {\n  public readonly code: string\n  protected _status: number\n  public readonly timestamp: Date\n  /**\n   * Opaque, un-scrubbed payload — may carry transport-layer detail\n   * (e.g. `AxiosError.config.url` / request headers) with credentials that the\n   * logger-side redaction does NOT scrub. It is defined **non-enumerable**\n   * (see the constructor) so property-walking serializers — a spread\n   * `{ ...err }`, `Object.keys(err)`, `Object.assign({}, err)`, or a\n   * Sentry-style capture — skip it and can't leak the secret. `toJSON()` /\n   * `toString()` already omit it too. It stays readable as `err.originalError`\n   * for local debugging; prefer `code` / `status` / `message` (and\n   * `AjaxError.requestInfo`, which IS redacted) for anything you log. (#73, #189)\n   */\n  declare public readonly originalError?: unknown\n\n  constructor(params: SdkErrorDetails) {\n    const message = SdkError.formatErrorMessage(params)\n    super(message)\n\n    this.name = 'SdkError' as const\n    this.code = params.code\n\n    this._status = params.status\n    // Non-enumerable so a serializer that walks own-enumerable properties\n    // (Sentry, `{ ...err }`, `Object.keys`) never sees the raw error and its\n    // credential-bearing `config`; still accessible via `err.originalError`. (#189)\n    Object.defineProperty(this, 'originalError', {\n      value: params.originalError,\n      enumerable: false,\n      writable: false,\n      configurable: true\n    })\n    this.timestamp = new Date()\n\n    this.cleanErrorStack()\n  }\n\n  get status(): number {\n    return this._status\n  }\n\n  /**\n   * Creates SdkError from exception\n   */\n  static fromException(error: unknown, context?: {\n    code?: string\n    status?: number\n  }): SdkError {\n    if (error instanceof SdkError) return error\n\n    return new SdkError({\n      code: context?.code || 'JSSDK_INTERNAL_ERROR',\n      status: context?.status || 500,\n      description: error instanceof Error ? error.message : `${error}`,\n      originalError: error\n    })\n  }\n\n  /**\n   * Serializes error for logging and debugging\n   */\n  toJSON() {\n    return {\n      name: this.name,\n      code: this.code,\n      message: this.message,\n      status: this._status,\n      timestamp: this.timestamp.toISOString(),\n      stack: this.stack\n    }\n  }\n\n  /**\n   * Formats error information for human-readable output\n   */\n  override toString(): string {\n    let output = `[${this.name}] ${this.code} (${this._status}): ${this.message}`\n\n    if (this.stack) {\n      output += `\\nStack trace:\\n${this.stack}`\n    }\n\n    return output\n  }\n\n  protected static formatErrorMessage(params: SdkErrorDetails): string {\n    if (!params?.description) {\n      return `Internal error`\n    }\n\n    return `${params.description}`\n  }\n\n  protected cleanErrorStack() {\n    if (typeof this.stack === 'string') {\n      this.stack = this.stack\n        .split('\\n')\n        .filter(line => !line.includes('SdkError.constructor'))\n        .join('\\n')\n    }\n  }\n}\n"],"names":[],"mappings":";;;;;;;;;;AAsBO,MAAM,iBAAiB,KAAA,CAAM;AAAA,EAtBpC;AAsBoC,IAAA,MAAA,CAAA,IAAA,EAAA,UAAA,CAAA;AAAA;AAAA,EAClB,IAAA;AAAA,EACN,OAAA;AAAA,EACM,SAAA;AAAA,EAchB,YAAY,MAAA,EAAyB;AACnC,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,kBAAA,CAAmB,MAAM,CAAA;AAClD,IAAA,KAAA,CAAM,OAAO,CAAA;AAEb,IAAA,IAAA,CAAK,IAAA,GAAO,UAAA;AACZ,IAAA,IAAA,CAAK,OAAO,MAAA,CAAO,IAAA;AAEnB,IAAA,IAAA,CAAK,UAAU,MAAA,CAAO,MAAA;AAItB,IAAA,MAAA,CAAO,cAAA,CAAe,MAAM,eAAA,EAAiB;AAAA,MAC3C,OAAO,MAAA,CAAO,aAAA;AAAA,MACd,UAAA,EAAY,KAAA;AAAA,MACZ,QAAA,EAAU,KAAA;AAAA,MACV,YAAA,EAAc;AAAA,KACf,CAAA;AACD,IAAA,IAAA,CAAK,SAAA,uBAAgB,IAAA,EAAK;AAE1B,IAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,EACvB;AAAA,EAEA,IAAI,MAAA,GAAiB;AACnB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,aAAA,CAAc,KAAA,EAAgB,OAAA,EAGxB;AACX,IAAA,IAAI,KAAA,YAAiB,UAAU,OAAO,KAAA;AAEtC,IAAA,OAAO,IAAI,QAAA,CAAS;AAAA,MAClB,IAAA,EAAM,SAAS,IAAA,IAAQ,sBAAA;AAAA,MACvB,MAAA,EAAQ,SAAS,MAAA,IAAU,GAAA;AAAA,MAC3B,aAAa,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,GAAG,KAAK,CAAA,CAAA;AAAA,MAC9D,aAAA,EAAe;AAAA,KAChB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAS;AACP,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,QAAQ,IAAA,CAAK,OAAA;AAAA,MACb,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,WAAA,EAAY;AAAA,MACtC,OAAO,IAAA,CAAK;AAAA,KACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKS,QAAA,GAAmB;AAC1B,IAAA,IAAI,MAAA,GAAS,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK,IAAA,CAAK,OAAO,CAAA,GAAA,EAAM,IAAA,CAAK,OAAO,CAAA,CAAA;AAE3E,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,MAAA,IAAU;AAAA;AAAA,EAAmB,KAAK,KAAK,CAAA,CAAA;AAAA,IACzC;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,OAAiB,mBAAmB,MAAA,EAAiC;AACnE,IAAA,IAAI,CAAC,QAAQ,WAAA,EAAa;AACxB,MAAA,OAAO,CAAA,cAAA,CAAA;AAAA,IACT;AAEA,IAAA,OAAO,CAAA,EAAG,OAAO,WAAW,CAAA,CAAA;AAAA,EAC9B;AAAA,EAEU,eAAA,GAAkB;AAC1B,IAAA,IAAI,OAAO,IAAA,CAAK,KAAA,KAAU,QAAA,EAAU;AAClC,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,KAAA,CACf,KAAA,CAAM,IAAI,CAAA,CACV,MAAA,CAAO,CAAA,IAAA,KAAQ,CAAC,KAAK,QAAA,CAAS,sBAAsB,CAAC,CAAA,CACrD,KAAK,IAAI,CAAA;AAAA,IACd;AAAA,EACF;AACF;;;;"}