UNPKG

@bitrix24/b24jssdk

Version:

Bitrix24 REST API JavaScript SDK

1 lines 9.11 kB
{"version":3,"file":"b24.cjs","sources":["../../../src/hook/b24.ts"],"sourcesContent":["import { SdkError } from '../core/sdk-error'\nimport type { AuthActions, B24HookParams } from '../types/auth'\nimport type { RestrictionParams } from '../types/limiters'\nimport type { TypeB24, ApiVersion } from '../types/b24'\nimport { AbstractB24 } from '../core/abstract-b24'\nimport { HttpV2 } from '../core/http/v2'\nimport { HttpV3 } from '../core/http/v3'\nimport { AuthHookManager } from './auth'\nimport { versionManager } from '../core/version-manager'\n\n/**\n * Server-side Bitrix24 client based on an inbound webhook URL.\n *\n * Use this class to make REST API calls from a backend service using a\n * pre-configured webhook. The webhook URL embeds a secret access key and\n * therefore **must never be used in browser or mobile code** — instantiating\n * `B24Hook` automatically enables a client-side warning for every HTTP call.\n *\n * @example\n * ```ts\n * const b24 = B24Hook.fromWebhookUrl('https://your_domain.bitrix24.com/rest/1/abc123xyz/')\n * const result = await b24.actions.v2.call.make({ method: 'user.current' })\n * ```\n *\n * @link https://bitrix24.github.io/b24jssdk/docs/hook/\n */\nexport class B24Hook extends AbstractB24 implements TypeB24 {\n readonly #authHookManager: AuthHookManager\n\n // region Init ////\n constructor(\n b24HookParams: B24HookParams,\n options?: {\n restrictionParams?: Partial<RestrictionParams>\n }\n ) {\n super()\n\n this.#authHookManager = new AuthHookManager(\n b24HookParams\n )\n\n const warningText = 'The B24Hook object is intended exclusively for use on the server.\\nA webhook contains a secret access key, which MUST NOT be used in client-side code (browser, mobile app).'\n\n this._httpV2 = new HttpV2(this.#authHookManager, this._getHttpOptions(), options?.restrictionParams)\n this._httpV2.setClientSideWarning(true, warningText)\n this._httpV3 = new HttpV3(this.#authHookManager, this._getHttpOptions(), options?.restrictionParams)\n this._httpV3.setClientSideWarning(true, warningText)\n\n this._isInit = true\n }\n // endregion ////\n\n override get auth(): AuthActions {\n return this.#authHookManager\n }\n\n // region Core ////\n /**\n * Disables warning about client-side query execution\n */\n public offClientSideWarning(): void {\n versionManager.getAllApiVersions().forEach((version) => {\n this.getHttpClient(version).setClientSideWarning(false, '')\n })\n }\n\n // endregion ////\n\n // region Get ////\n /**\n * @inheritDoc\n */\n public override getTargetOrigin(): string {\n this._ensureInitialized()\n return this.#authHookManager.getTargetOrigin()\n }\n\n /**\n * @inheritDoc\n */\n public override getTargetOriginWithPath(): Map<ApiVersion, string> {\n this._ensureInitialized()\n return this.#authHookManager.getTargetOriginWithPath()\n }\n\n // endregion ////\n\n // region Tools ////\n /**\n * Creates a `B24Hook` instance from a webhook URL.\n *\n * Accepts both REST API v2 and v3 webhook formats:\n * - v2: `https://your_domain.bitrix24.com/rest/{userId}/{secret}`\n * - v3: `https://your_domain.bitrix24.com/rest/api/{userId}/{secret}`\n *\n * Validates that the URL uses HTTPS, has the correct path structure, and\n * contains a numeric user ID. Throws a descriptive `Error` on any violation\n * without echoing the URL (which contains the secret).\n *\n * @param url - Full webhook URL as shown in the Bitrix24 admin panel.\n * @param options - Optional restriction parameters (rate limits, etc.).\n * @returns A ready-to-use `B24Hook` instance.\n * @throws {SdkError} If the URL is empty (`JSSDK_HOOK_URL_EMPTY`), unparseable\n * (`JSSDK_HOOK_URL_INVALID`), not HTTPS (`JSSDK_HOOK_URL_NOT_HTTPS`),\n * malformed (`JSSDK_HOOK_URL_MALFORMED`), or the userId segment is not\n * numeric (`JSSDK_HOOK_URL_USER_ID_NOT_NUMERIC`).\n */\n public static fromWebhookUrl(\n url: string,\n options?: { restrictionParams?: Partial<RestrictionParams> }\n ): B24Hook {\n if (!url.trim()) {\n throw new SdkError({ code: 'JSSDK_HOOK_URL_EMPTY', description: 'Webhook URL cannot be empty', status: 0 })\n }\n\n let parsedUrl: URL\n\n try {\n parsedUrl = new URL(url.replace('/rest/api', '/rest'))\n } catch {\n // Don't echo the URL — it carries the webhook secret in its path (#43).\n throw new SdkError({ code: 'JSSDK_HOOK_URL_INVALID', description: 'Invalid webhook URL format', status: 0 })\n }\n\n if (parsedUrl.protocol !== 'https:') {\n throw new SdkError({ code: 'JSSDK_HOOK_URL_NOT_HTTPS', description: 'Webhook requires HTTPS protocol', status: 0 })\n }\n\n const pathParts = parsedUrl.pathname.split('/').filter(Boolean)\n const isValidFormat = (\n // Format: /rest/{id}/{webhook}\n (pathParts.length === 3 && pathParts[0] === 'rest')\n // Format: /rest/api/{id}/{webhook}\n || (pathParts.length === 4 && pathParts[0] === 'rest' && pathParts[1] === 'api')\n )\n\n if (!isValidFormat) {\n throw new SdkError({ code: 'JSSDK_HOOK_URL_MALFORMED', description: 'Webhook URL must follow format: /rest/<userId>/<secret> or /rest/api/<userId>/<secret>', status: 0 })\n }\n\n // Determine the position of userId and secret depending on the format\n const userIdIndex = pathParts[1] === 'api' ? 2 : 1\n const secretIndex = pathParts[1] === 'api' ? 3 : 2\n\n const userIdStr = pathParts[userIdIndex]!\n const secret = pathParts[secretIndex]!\n\n if (!/^\\d+$/.test(userIdStr)) {\n // Don't echo the segment — in a transposed URL it could be the secret (#43).\n throw new SdkError({ code: 'JSSDK_HOOK_URL_USER_ID_NOT_NUMERIC', description: 'User ID must be numeric in webhook URL', status: 0 })\n }\n const userId = Number.parseInt(userIdStr, 10)\n\n return new B24Hook(\n {\n b24Url: parsedUrl.origin,\n userId,\n secret\n },\n options\n )\n }\n // endregion ////\n}\n"],"names":["AbstractB24","AuthHookManager","HttpV2","HttpV3","versionManager","SdkError"],"mappings":"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"}