@bitrix24/b24jssdk
Version:
Bitrix24 REST API JavaScript SDK
1 lines • 10.5 kB
Source Map (JSON)
{"version":3,"file":"long-polling-connector.mjs","sources":["../../../src/pullClient/long-polling-connector.ts"],"sourcesContent":["import type { ConnectorConfig } from '../types/pull'\nimport { Type } from '../tools/type'\nimport { Text } from '../tools/text'\nimport { AbstractConnector } from './abstract-connector'\nimport { ConnectionType } from '../types/pull'\n\nconst LONG_POLLING_TIMEOUT = 60\n\nexport class LongPollingConnector extends AbstractConnector {\n private _active: boolean\n\n private _requestTimeout: ReturnType<typeof setTimeout> | null\n private _failureTimeout: ReturnType<typeof setTimeout> | null\n // Created lazily on the first connect() rather than in the constructor: the\n // connector is built eagerly by PullClient.init() (which runs inside start())\n // regardless of the chosen transport, and `new XMLHttpRequest()` throws a\n // ReferenceError under SSR/Node where the global is absent. Deferring it keeps\n // construct + init + start SSR-safe; connect() degrades gracefully instead. (#222)\n private _xhr: XMLHttpRequest | null\n private _requestAborted: boolean\n\n constructor(config: ConnectorConfig) {\n super(config)\n\n this._active = false\n this._connectionType = ConnectionType.LongPolling\n\n this._requestTimeout = null\n this._failureTimeout = null\n this._xhr = null\n this._requestAborted = false\n }\n\n /**\n * @inheritDoc\n */\n override connect(): void {\n if (!this._xhr) {\n // No XMLHttpRequest under SSR/Node: a long-polling connection needs a\n // browser. Surface a clean error instead of a raw ReferenceError. (#222)\n if (typeof XMLHttpRequest === 'undefined') {\n this._callbacks.onError(\n new Error(\n 'LongPollingConnector: XMLHttpRequest is not available in this'\n + ' environment (SSR/Node); a long-polling connection requires a browser'\n )\n )\n return\n }\n this._xhr = this.createXhr()\n }\n\n this._active = true\n this.performRequest()\n }\n\n /**\n * @inheritDoc\n * @param code\n * @param reason\n */\n override disconnect(code: number, reason: string): void {\n this._active = false\n\n this.clearTimeOut()\n\n if (this._xhr) {\n this._requestAborted = true\n this._xhr.abort()\n }\n\n this._disconnectCode = code\n this._disconnectReason = reason\n this.connected = false\n }\n\n private performRequest(): void {\n if (!this._active) {\n return\n }\n\n if (!this.connectionPath) {\n throw new Error('Long polling connection path is not defined')\n }\n\n const xhr = this._xhr\n if (!xhr) {\n return\n }\n\n if (xhr.readyState !== 0 && xhr.readyState !== 4) {\n return\n }\n\n this.clearTimeOut()\n\n this._failureTimeout = setTimeout(() => {\n this.connected = true\n }, 5_000)\n\n this._requestTimeout = setTimeout(\n this.onRequestTimeout.bind(this),\n LONG_POLLING_TIMEOUT * 1_000\n )\n\n xhr.open('GET', this.connectionPath)\n xhr.send()\n }\n\n private onRequestTimeout() {\n this._requestAborted = true\n this._xhr?.abort()\n this.performRequest()\n }\n\n private onXhrReadyStateChange(): void {\n const xhr = this._xhr\n if (!xhr) {\n return\n }\n\n if (xhr.readyState === 4) {\n if (!this._requestAborted || xhr.status == 200) {\n this.onResponse(xhr.response)\n }\n\n this._requestAborted = false\n }\n }\n\n /**\n * Via http request\n * @inheritDoc\n */\n override send(buffer: ArrayBuffer | string): boolean {\n const path = this._parent.getPublicationPath()\n if (!path) {\n this.getLogger().error(`${Text.getDateForLog()}: Pull: publication path is empty`).catch(() => {})\n return false\n }\n\n if (typeof XMLHttpRequest === 'undefined') {\n this.getLogger().error(\n `${Text.getDateForLog()}: Pull: XMLHttpRequest is not available; cannot publish`\n ).catch(() => {})\n return false\n }\n\n const xhr = new XMLHttpRequest()\n xhr.open('POST', path)\n xhr.send(buffer)\n\n return true\n }\n\n private onResponse(response: any): void {\n this.clearTimeOut()\n\n const xhr = this._xhr\n if (!xhr) {\n return\n }\n\n if (xhr.status === 200) {\n this.connected = true\n if (Type.isStringFilled(response) || response instanceof ArrayBuffer) {\n this._callbacks.onMessage(response)\n } else {\n this._parent.session.mid = null\n }\n this.performRequest()\n } else if (xhr.status === 304) {\n this.connected = true\n if (\n xhr.getResponseHeader('Expires')\n === 'Thu, 01 Jan 1973 11:11:01 GMT'\n ) {\n const lastMessageId = xhr.getResponseHeader('Last-Message-Id')\n if (Type.isStringFilled(lastMessageId)) {\n this._parent.setLastMessageId(lastMessageId || '')\n }\n }\n this.performRequest()\n } else {\n this._callbacks.onError(new Error('Could not connect to the server'))\n\n this.connected = false\n }\n }\n\n // region Tools ////\n private clearTimeOut(): void {\n if (this._failureTimeout) {\n clearTimeout(this._failureTimeout)\n this._failureTimeout = null\n }\n\n if (this._requestTimeout) {\n clearTimeout(this._requestTimeout)\n this._requestTimeout = null\n }\n }\n\n private createXhr(): XMLHttpRequest {\n const result = new XMLHttpRequest()\n\n if (this._parent.isProtobufSupported() && !this._parent.isJsonRpc()) {\n result.responseType = 'arraybuffer'\n }\n\n result.addEventListener(\n 'readystatechange',\n this.onXhrReadyStateChange.bind(this)\n )\n\n return result\n }\n // endregion ////\n}\n"],"names":[],"mappings":"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"}