From 5189340e4fb296a0e06eaf4b3e3becc1644b8dc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20De=20Boey?= Date: Thu, 7 Aug 2025 14:17:08 +0000 Subject: [PATCH] refactor(gax): use native `AbortController` --- gax/package.json | 1 - gax/src/fallbackServiceStub.ts | 10 +++------- gax/src/featureDetection.ts | 5 ----- gax/src/streamArrayParser.ts | 10 +++------- gax/test/unit/grpc-fallback.ts | 32 ++++++++------------------------ 5 files changed, 14 insertions(+), 44 deletions(-) diff --git a/gax/package.json b/gax/package.json index 03e940a30..eb2d6d2cb 100644 --- a/gax/package.json +++ b/gax/package.json @@ -12,7 +12,6 @@ "dependencies": { "@grpc/grpc-js": "^1.12.6", "@grpc/proto-loader": "^0.8.0", - "abort-controller": "^3.0.0", "duplexify": "^4.1.3", "google-auth-library": "^10.1.0", "google-logging-utils": "^1.1.1", diff --git a/gax/src/fallbackServiceStub.ts b/gax/src/fallbackServiceStub.ts index 17ebfac32..ca1d3dc16 100644 --- a/gax/src/fallbackServiceStub.ts +++ b/gax/src/fallbackServiceStub.ts @@ -15,12 +15,11 @@ */ import type {Response as NodeFetchResponse} from 'node-fetch' with {'resolution-mode': 'import'}; -import {AbortController as NodeAbortController} from 'abort-controller'; import {AuthClient, GoogleAuth, gaxios} from 'google-auth-library'; import * as serializer from 'proto3-json-serializer'; -import {hasAbortController, isNodeJS} from './featureDetection'; +import {isNodeJS} from './featureDetection'; import {StreamArrayParser} from './streamArrayParser'; import {defaultToObjectOptions} from './fallback'; import {pipeline, PipelineSource} from 'stream'; @@ -146,10 +145,7 @@ export function generateServiceStub( }; } - const cancelController = hasAbortController() - ? new AbortController() - : new NodeAbortController(); - const cancelSignal = cancelController.signal as AbortSignal; + const cancelController = new AbortController(); let cancelRequested = false; const url = fetchParameters.url; const headers = new Headers(fetchParameters.headers); @@ -162,7 +158,7 @@ export function generateServiceStub( headers: headers, body: fetchParameters.body, method: fetchParameters.method, - signal: cancelSignal, + signal: cancelController.signal, responseType: 'stream', // ensure gaxios returns the data directly so that it handle data/streams itself agent: agentOption || undefined, }; diff --git a/gax/src/featureDetection.ts b/gax/src/featureDetection.ts index 63ae29271..0267207e4 100644 --- a/gax/src/featureDetection.ts +++ b/gax/src/featureDetection.ts @@ -26,7 +26,6 @@ const features = { // eslint-disable-next-line n/no-unsupported-features/node-builtins textDecoder: typeof TextDecoder !== 'undefined', nodeJS: typeof process !== 'undefined' && process?.versions?.node, - abortController: typeof AbortController !== 'undefined', }; export function hasWindowFetch() { @@ -36,7 +35,3 @@ export function hasWindowFetch() { export function isNodeJS() { return features.nodeJS; } - -export function hasAbortController() { - return features.abortController; -} diff --git a/gax/src/streamArrayParser.ts b/gax/src/streamArrayParser.ts index 4d001894a..0ef6a0f1c 100644 --- a/gax/src/streamArrayParser.ts +++ b/gax/src/streamArrayParser.ts @@ -14,11 +14,9 @@ * limitations under the License. */ -import {AbortController as NodeAbortController} from 'abort-controller'; -import {Transform} from 'stream'; +import {Transform} from 'node:stream'; import {decodeResponse} from './fallbackRest'; -import {hasAbortController} from './featureDetection'; export class StreamArrayParser extends Transform { private _done: boolean; @@ -27,7 +25,7 @@ export class StreamArrayParser extends Transform { private _isSkipped: boolean; private _level: number; rpc: protobuf.Method; - cancelController: AbortController | NodeAbortController; + cancelController: AbortController; cancelSignal: AbortSignal; cancelRequested: boolean; /** @@ -59,9 +57,7 @@ export class StreamArrayParser extends Transform { this._isSkipped = false; this._level = 0; this.rpc = rpc; - this.cancelController = hasAbortController() - ? new AbortController() - : new NodeAbortController(); + this.cancelController = new AbortController(); this.cancelSignal = this.cancelController.signal as AbortSignal; this.cancelRequested = false; } diff --git a/gax/test/unit/grpc-fallback.ts b/gax/test/unit/grpc-fallback.ts index cc90f36b5..b249ef240 100644 --- a/gax/test/unit/grpc-fallback.ts +++ b/gax/test/unit/grpc-fallback.ts @@ -17,9 +17,8 @@ /* eslint-disable @typescript-eslint/ban-ts-comment */ /* eslint-disable no-undef */ -import assert from 'assert'; +import assert from 'node:assert'; import {describe, it, beforeEach, afterEach, after} from 'mocha'; -import * as abortController from 'abort-controller'; import * as protobuf from 'protobufjs'; import * as sinon from 'sinon'; import echoProtoJson = require('../fixtures/echo.json'); @@ -28,9 +27,6 @@ import {ClientStubOptions, GoogleAuth, GoogleError} from '../../src'; import {PassThroughClient} from 'google-auth-library'; import {setMockFallbackResponse} from './utils'; -// @ts-ignore -const hasAbortController = typeof AbortController !== 'undefined'; - let authClient = new PassThroughClient(); let opts = { auth: new GoogleAuth({authClient}), @@ -173,9 +169,7 @@ describe('grpc-fallback', () => { stubOptions: ClientStubOptions; const createdAbortControllers: string[] = []; // @ts-ignore - const savedAbortController = hasAbortController - ? AbortController - : abortController.AbortController; + const savedAbortController = AbortController; beforeEach(() => { stubOptions = { @@ -201,14 +195,9 @@ describe('grpc-fallback', () => { createdAbortControllers.push(this); }; - if (hasAbortController) { - // @ts-ignore - // eslint-disable-next-line no-global-assign - AbortController = FakeAbortController; - } else { - // @ts-ignore - abortController.AbortController = FakeAbortController; - } + // @ts-ignore + // eslint-disable-next-line no-global-assign + AbortController = FakeAbortController; }); beforeEach(() => { @@ -220,14 +209,9 @@ describe('grpc-fallback', () => { }); after(() => { - if (hasAbortController) { - // @ts-ignore - // eslint-disable-next-line no-global-assign - AbortController = savedAbortController; - } else { - // @ts-ignore - abortController.AbortController = savedAbortController; - } + // @ts-ignore + // eslint-disable-next-line no-global-assign + AbortController = savedAbortController; }); it('should send grpc-web version in the header', () => {