From 3b9accd2eefcfaebd2a6e413680001d647f408f4 Mon Sep 17 00:00:00 2001 From: Sadiq <161265120+dahaque@users.noreply.github.com> Date: Tue, 9 Dec 2025 15:02:25 +0530 Subject: [PATCH 1/3] feat: add timeout support to RequestContext and IsomorphicFetchHttpLibrary --- src/gen/http/http.ts | 14 ++++++++++++++ src/gen/http/isomorphic-fetch.ts | 23 ++++++++++++++++++++++- src/testTimeout.ts | 13 +++++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 src/testTimeout.ts diff --git a/src/gen/http/http.ts b/src/gen/http/http.ts index 79bcf792e0..0b3c68650a 100644 --- a/src/gen/http/http.ts +++ b/src/gen/http/http.ts @@ -152,6 +152,20 @@ export class RequestContext { public getAgent(): http.Agent | https.Agent | undefined { return this.agent; } + + // Optional timeout (in ms). When set, the request will be aborted if it exceeds this duration. + private timeout: number | undefined = undefined; + + //Allows the caller to specify a timeout (in milliseconds) for this request. + public setTimeout(timeout : number){ + this.timeout = timeout; + } + + //Returns the timeout value configured for this request if any. + public getTimeout(): number | undefined { + return this.timeout; + } + } export interface ResponseBody { diff --git a/src/gen/http/isomorphic-fetch.ts b/src/gen/http/isomorphic-fetch.ts index 2d3d6179aa..8b037be841 100644 --- a/src/gen/http/isomorphic-fetch.ts +++ b/src/gen/http/isomorphic-fetch.ts @@ -8,13 +8,34 @@ export class IsomorphicFetchHttpLibrary implements HttpLibrary { let method = request.getHttpMethod().toString(); let body = request.getBody(); + const controller = new AbortController(); + const userSignal = request.getSignal(); + + //if the user already set a signal, pipe abort events + if(userSignal){ + userSignal.addEventListener("abort", () => controller.abort()) + } + + const timeout = request.getTimeout(); + let timeoutId : NodeJS.Timeout | undefined; + if(timeout){ + timeoutId = setTimeout (() => { + controller.abort() + }, timeout) + } + const resultPromise = fetch(request.getUrl(), { method: method, body: body as any, headers: request.getHeaders(), - signal: request.getSignal(), + signal: controller.signal, agent: request.getAgent(), }).then((resp: any) => { + + if(timeoutId){ + clearTimeout(timeoutId) + } + const headers: { [name: string]: string } = {}; resp.headers.forEach((value: string, name: string) => { headers[name] = value; diff --git a/src/testTimeout.ts b/src/testTimeout.ts new file mode 100644 index 0000000000..3904dd9b62 --- /dev/null +++ b/src/testTimeout.ts @@ -0,0 +1,13 @@ +import { RequestContext, HttpMethod } from '../src/gen/http/http.ts'; +import { IsomorphicFetchHttpLibrary } from '../src/gen/http/isomorphic-fetch.ts'; + +const http = new IsomorphicFetchHttpLibrary(); + +// URL that delays response for 5 seconds +const req = new RequestContext('https://httpbin.org/delay/5', HttpMethod.GET); +req.setTimeout(2000); // 2s timeout + +http.send(req) + .toPromise?.() + .then(console.log) + .catch((err) => console.error('TIMED OUT:', err)); From 6d924b4292fb2456f318afa296bcdc12010cac66 Mon Sep 17 00:00:00 2001 From: Sadiq <161265120+dahaque@users.noreply.github.com> Date: Wed, 10 Dec 2025 01:27:17 +0530 Subject: [PATCH 2/3] Revert manual edits to src/gen; move generator changes to upstream --- package-lock.json | 159 ++++++++++++++++++++++++++++++++++++++++++ package.json | 1 + src/gen/rxjsStub.js | 32 +++++++++ src/gen/tsconfig.json | 3 - tsconfig.json | 4 +- 5 files changed, 195 insertions(+), 4 deletions(-) create mode 100644 src/gen/rxjsStub.js diff --git a/package-lock.json b/package-lock.json index 5ae20c4055..113f794581 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,6 +38,7 @@ "prettier": "^3.0.0", "pretty-quick": "^4.0.0", "ts-mockito": "^2.3.1", + "ts-node": "^10.9.2", "tsx": "^4.19.1", "typedoc": "^0.28.0", "typescript": "~5.9.2", @@ -54,6 +55,30 @@ "node": ">=18" } }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.0.tgz", @@ -964,6 +989,34 @@ "dev": true, "license": "MIT" }, + "node_modules/@tsconfig/node10": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", + "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", @@ -1016,6 +1069,7 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~7.16.0" } @@ -1302,6 +1356,19 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/agent-base": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", @@ -1357,6 +1424,13 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -1672,6 +1746,13 @@ "dev": true, "license": "MIT" }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -1720,6 +1801,16 @@ "node": ">=0.4.0" } }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -2786,6 +2877,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, "node_modules/markdown-it": { "version": "14.1.0", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", @@ -3595,6 +3693,50 @@ "lodash": "^4.17.5" } }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -3721,6 +3863,13 @@ "punycode": "^2.1.0" } }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, "node_modules/v8-to-istanbul": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", @@ -3997,6 +4146,16 @@ "node": ">=8" } }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index c801a5ad52..4100c03298 100644 --- a/package.json +++ b/package.json @@ -84,6 +84,7 @@ "prettier": "^3.0.0", "pretty-quick": "^4.0.0", "ts-mockito": "^2.3.1", + "ts-node": "^10.9.2", "tsx": "^4.19.1", "typedoc": "^0.28.0", "typescript": "~5.9.2", diff --git a/src/gen/rxjsStub.js b/src/gen/rxjsStub.js new file mode 100644 index 0000000000..3d36ebfc83 --- /dev/null +++ b/src/gen/rxjsStub.js @@ -0,0 +1,32 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Observable = void 0; +exports.from = from; +exports.of = of; +exports.mergeMap = mergeMap; +exports.map = map; +var Observable = /** @class */ (function () { + function Observable(promise) { + this.promise = promise; + } + Observable.prototype.toPromise = function () { + return this.promise; + }; + Observable.prototype.pipe = function (callback) { + return new Observable(this.promise.then(callback)); + }; + return Observable; +}()); +exports.Observable = Observable; +function from(promise) { + return new Observable(promise); +} +function of(value) { + return new Observable(Promise.resolve(value)); +} +function mergeMap(callback) { + return function (value) { return callback(value).toPromise(); }; +} +function map(callback) { + return callback; +} diff --git a/src/gen/tsconfig.json b/src/gen/tsconfig.json index 8df0d1a5bc..3a221ac4e8 100644 --- a/src/gen/tsconfig.json +++ b/src/gen/tsconfig.json @@ -29,8 +29,5 @@ "exclude": [ "dist", "node_modules" - ], - "filesGlob": [ - "./**/*.ts", ] } diff --git a/tsconfig.json b/tsconfig.json index 20caf8fc24..63f7f2905d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -16,7 +16,9 @@ "importHelpers": true, "skipLibCheck": true, "esModuleInterop": true, - "useDefineForClassFields": false + "useDefineForClassFields": false, + "noEmit": true, + "allowImportingTsExtensions": true // enable this in the future // "declarationMap": true }, From 8ce466f117e69509bd3bdb7a21737b62e27e52ba Mon Sep 17 00:00:00 2001 From: Sadiq <161265120+dahaque@users.noreply.github.com> Date: Wed, 10 Dec 2025 01:33:01 +0530 Subject: [PATCH 3/3] Removed changes from src/gen (auto-generated files) --- src/gen/http/http.ts | 14 ----------- src/gen/http/isomorphic-fetch.ts | 23 +------------------ src/gen/tsconfig.json | 3 +++ ...testTimeout.ts => testTimeout.ts.disabled} | 0 4 files changed, 4 insertions(+), 36 deletions(-) rename src/{testTimeout.ts => testTimeout.ts.disabled} (100%) diff --git a/src/gen/http/http.ts b/src/gen/http/http.ts index 0b3c68650a..79bcf792e0 100644 --- a/src/gen/http/http.ts +++ b/src/gen/http/http.ts @@ -152,20 +152,6 @@ export class RequestContext { public getAgent(): http.Agent | https.Agent | undefined { return this.agent; } - - // Optional timeout (in ms). When set, the request will be aborted if it exceeds this duration. - private timeout: number | undefined = undefined; - - //Allows the caller to specify a timeout (in milliseconds) for this request. - public setTimeout(timeout : number){ - this.timeout = timeout; - } - - //Returns the timeout value configured for this request if any. - public getTimeout(): number | undefined { - return this.timeout; - } - } export interface ResponseBody { diff --git a/src/gen/http/isomorphic-fetch.ts b/src/gen/http/isomorphic-fetch.ts index 8b037be841..2d3d6179aa 100644 --- a/src/gen/http/isomorphic-fetch.ts +++ b/src/gen/http/isomorphic-fetch.ts @@ -8,34 +8,13 @@ export class IsomorphicFetchHttpLibrary implements HttpLibrary { let method = request.getHttpMethod().toString(); let body = request.getBody(); - const controller = new AbortController(); - const userSignal = request.getSignal(); - - //if the user already set a signal, pipe abort events - if(userSignal){ - userSignal.addEventListener("abort", () => controller.abort()) - } - - const timeout = request.getTimeout(); - let timeoutId : NodeJS.Timeout | undefined; - if(timeout){ - timeoutId = setTimeout (() => { - controller.abort() - }, timeout) - } - const resultPromise = fetch(request.getUrl(), { method: method, body: body as any, headers: request.getHeaders(), - signal: controller.signal, + signal: request.getSignal(), agent: request.getAgent(), }).then((resp: any) => { - - if(timeoutId){ - clearTimeout(timeoutId) - } - const headers: { [name: string]: string } = {}; resp.headers.forEach((value: string, name: string) => { headers[name] = value; diff --git a/src/gen/tsconfig.json b/src/gen/tsconfig.json index 3a221ac4e8..8df0d1a5bc 100644 --- a/src/gen/tsconfig.json +++ b/src/gen/tsconfig.json @@ -29,5 +29,8 @@ "exclude": [ "dist", "node_modules" + ], + "filesGlob": [ + "./**/*.ts", ] } diff --git a/src/testTimeout.ts b/src/testTimeout.ts.disabled similarity index 100% rename from src/testTimeout.ts rename to src/testTimeout.ts.disabled