UNPKG

@bitrix24/b24jssdk

Version:

Bitrix24 REST API JavaScript SDK

1 lines 6.11 kB
{"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":"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"}