From 79cfe4e17fd77b2a47639ec1f1a076cffe396b2d Mon Sep 17 00:00:00 2001 From: Aliullov Vlad Date: Thu, 5 Mar 2026 11:39:42 +0100 Subject: [PATCH 1/5] remove rxjs from http in devextreme-angular --- packages/devextreme-angular/src/http/ajax.ts | 60 ++++++++++++++------ 1 file changed, 44 insertions(+), 16 deletions(-) diff --git a/packages/devextreme-angular/src/http/ajax.ts b/packages/devextreme-angular/src/http/ajax.ts index 8a2e5f76b439..34541455cf0f 100644 --- a/packages/devextreme-angular/src/http/ajax.ts +++ b/packages/devextreme-angular/src/http/ajax.ts @@ -1,8 +1,6 @@ import { HttpClient, HttpEventType, HttpParams, HttpEvent, HttpErrorResponse, HttpResponse, } from '@angular/common/http'; -import { throwError, Subject } from 'rxjs'; -import { takeUntil, timeoutWith } from 'rxjs/operators'; import { Deferred, DeferredObj } from 'devextreme/core/utils/deferred'; import { isDefined } from 'devextreme/core/utils/type'; import { getWindow } from 'devextreme/core/utils/window'; @@ -33,6 +31,10 @@ interface XHRSurrogate { statusText?: string; } +interface SubscriptionLike { + unsubscribe(): void; +} + const PARSER_ERROR = 'parsererror'; const SUCCESS = 'success'; const ERROR = 'error'; @@ -206,7 +208,9 @@ function getUploadCallbacks(options: Options, deferred: DeferredResult, xhrSurro } export const sendRequestFactory = (httpClient: HttpClient) => (options: Options) => { - const abort$ = new Subject(); + let subscription: SubscriptionLike | null = null; + let timeoutId: ReturnType | null = null; + const deferred: DeferredResult = Deferred(); const result = deferred.promise() as Result; const isGet = isGetMethod(options); @@ -222,7 +226,12 @@ export const sendRequestFactory = (httpClient: HttpClient) => (options: Options) aborted: false, abort() { this.aborted = true; - abort$.next(); + if (timeoutId !== null) { + clearTimeout(timeoutId); + timeoutId = null; + } + subscription?.unsubscribe(); + subscription = null; }, }; @@ -276,18 +285,37 @@ export const sendRequestFactory = (httpClient: HttpClient) => (options: Options) }, ); - const subscriptionCallbacks = upload - ? getUploadCallbacks - : getRequestCallbacks; - - request.pipe.apply(request, [ - takeUntil(abort$) as any, - ...options.timeout - ? [timeoutWith(options.timeout, throwError({ statusText: TIMEOUT, status: 0, ok: false })) as any] - : [], - ]).subscribe( - subscriptionCallbacks(options, deferred, xhrSurrogate), - ); + const clearTimeoutIfSet = () => { + if (timeoutId !== null) { + clearTimeout(timeoutId); + timeoutId = null; + } + }; + + if (options.timeout) { + timeoutId = setTimeout(() => { + timeoutId = null; + deferred.reject({ statusText: TIMEOUT, status: 0, ok: false }); + subscription?.unsubscribe(); + subscription = null; + }, options.timeout); + } + + const callbacks = upload + ? getUploadCallbacks(options, deferred, xhrSurrogate) + : getRequestCallbacks(options, deferred, xhrSurrogate); + + subscription = request.subscribe({ + next(value) { + clearTimeoutIfSet(); + callbacks.next(value); + }, + error(err) { + clearTimeoutIfSet(); + callbacks.error(err); + }, + complete: callbacks.complete, + }); return result; }; From 031d232154bf526e6a3b6b5f100c5467b657a0e8 Mon Sep 17 00:00:00 2001 From: Aliullov Vlad Date: Thu, 5 Mar 2026 20:42:48 +0100 Subject: [PATCH 2/5] remove rxjs from http in devextreme-angular --- packages/devextreme-angular/src/http/ajax.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/devextreme-angular/src/http/ajax.ts b/packages/devextreme-angular/src/http/ajax.ts index 34541455cf0f..7a0da1beb0d8 100644 --- a/packages/devextreme-angular/src/http/ajax.ts +++ b/packages/devextreme-angular/src/http/ajax.ts @@ -232,6 +232,7 @@ export const sendRequestFactory = (httpClient: HttpClient) => (options: Options) } subscription?.unsubscribe(); subscription = null; + rejectIfAborted(deferred, this, () => options.upload?.onabort?.(this)); }, }; From 26a7bc3cc778cadf0e5b85e5494e8f9d113630f2 Mon Sep 17 00:00:00 2001 From: Aliullov Vlad Date: Thu, 5 Mar 2026 21:50:17 +0100 Subject: [PATCH 3/5] remove rxjs from http in devextreme-angular + fix lint + remove rxjs from deps --- packages/devextreme-angular/package.json | 1 - packages/devextreme-angular/src/http/ajax.ts | 6 +++--- pnpm-lock.yaml | 3 --- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/packages/devextreme-angular/package.json b/packages/devextreme-angular/package.json index 03d3fd71c4f5..a29801618721 100644 --- a/packages/devextreme-angular/package.json +++ b/packages/devextreme-angular/package.json @@ -61,7 +61,6 @@ "karma-webpack": "5.0.1", "ng-packagr": "catalog:angular", "puppeteer": "23.6.1", - "rxjs": "7.8.2", "reflect-metadata": "0.1.13", "stream-browserify": "3.0.0", "style-loader": "3.3.4", diff --git a/packages/devextreme-angular/src/http/ajax.ts b/packages/devextreme-angular/src/http/ajax.ts index 7a0da1beb0d8..4cbc57dfcfcd 100644 --- a/packages/devextreme-angular/src/http/ajax.ts +++ b/packages/devextreme-angular/src/http/ajax.ts @@ -32,7 +32,7 @@ interface XHRSurrogate { } interface SubscriptionLike { - unsubscribe(): void; + unsubscribe: () => void; } const PARSER_ERROR = 'parsererror'; @@ -303,8 +303,8 @@ export const sendRequestFactory = (httpClient: HttpClient) => (options: Options) } const callbacks = upload - ? getUploadCallbacks(options, deferred, xhrSurrogate) - : getRequestCallbacks(options, deferred, xhrSurrogate); + ? getUploadCallbacks(options, deferred, xhrSurrogate) + : getRequestCallbacks(options, deferred, xhrSurrogate); subscription = request.subscribe({ next(value) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 13e7a0673329..06c279429796 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1925,9 +1925,6 @@ importers: reflect-metadata: specifier: 0.1.13 version: 0.1.13 - rxjs: - specifier: 7.8.2 - version: 7.8.2 stream-browserify: specifier: 3.0.0 version: 3.0.0 From 8dc2f178d786bad8d137c8aa264fb18fcf14fed4 Mon Sep 17 00:00:00 2001 From: Aliullov Vlad Date: Thu, 5 Mar 2026 22:36:16 +0100 Subject: [PATCH 4/5] remove rxjs from http in devextreme-angular + keep rxjs only in devDeps --- packages/devextreme-angular/package.json | 1 + pnpm-lock.yaml | 3 +++ 2 files changed, 4 insertions(+) diff --git a/packages/devextreme-angular/package.json b/packages/devextreme-angular/package.json index a29801618721..03d3fd71c4f5 100644 --- a/packages/devextreme-angular/package.json +++ b/packages/devextreme-angular/package.json @@ -61,6 +61,7 @@ "karma-webpack": "5.0.1", "ng-packagr": "catalog:angular", "puppeteer": "23.6.1", + "rxjs": "7.8.2", "reflect-metadata": "0.1.13", "stream-browserify": "3.0.0", "style-loader": "3.3.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 06c279429796..13e7a0673329 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1925,6 +1925,9 @@ importers: reflect-metadata: specifier: 0.1.13 version: 0.1.13 + rxjs: + specifier: 7.8.2 + version: 7.8.2 stream-browserify: specifier: 3.0.0 version: 3.0.0 From 87f98dbe22953768c7bb439fd7e6c5038097e152 Mon Sep 17 00:00:00 2001 From: Aliullov Vlad Date: Fri, 6 Mar 2026 00:27:09 +0100 Subject: [PATCH 5/5] remove rxjs from http in devextreme-angular + refactor --- packages/devextreme-angular/src/http/ajax.ts | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/packages/devextreme-angular/src/http/ajax.ts b/packages/devextreme-angular/src/http/ajax.ts index 4cbc57dfcfcd..28038cf99a2e 100644 --- a/packages/devextreme-angular/src/http/ajax.ts +++ b/packages/devextreme-angular/src/http/ajax.ts @@ -220,16 +220,20 @@ export const sendRequestFactory = (httpClient: HttpClient) => (options: Options) options.crossDomain = isCrossDomain(options.url); options.cache = isCacheNeed(options); + const clearTimeoutIfSet = () => { + if (timeoutId !== null) { + clearTimeout(timeoutId); + timeoutId = null; + } + }; + const headers = getRequestHeaders(options); const xhrSurrogate: XHRSurrogate = { type: 'XMLHttpRequestSurrogate', aborted: false, abort() { this.aborted = true; - if (timeoutId !== null) { - clearTimeout(timeoutId); - timeoutId = null; - } + clearTimeoutIfSet(); subscription?.unsubscribe(); subscription = null; rejectIfAborted(deferred, this, () => options.upload?.onabort?.(this)); @@ -286,13 +290,6 @@ export const sendRequestFactory = (httpClient: HttpClient) => (options: Options) }, ); - const clearTimeoutIfSet = () => { - if (timeoutId !== null) { - clearTimeout(timeoutId); - timeoutId = null; - } - }; - if (options.timeout) { timeoutId = setTimeout(() => { timeoutId = null;