diff --git a/.changeset/light-snakes-exercise.md b/.changeset/light-snakes-exercise.md
new file mode 100644
index 0000000000..45bd37cf27
--- /dev/null
+++ b/.changeset/light-snakes-exercise.md
@@ -0,0 +1,16 @@
+---
+'@backstage/backend-common': minor
+'@backstage/backend-tasks': minor
+'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch
+'@backstage/plugin-search-backend-node': patch
+---
+
+Changed to use native `AbortController` and `AbortSignal` from Node.js, instead
+of the one from `node-abort-controller`. This is possible now that the minimum
+supported Node.js version of the project is 16.
+
+Note that their interfaces are very slightly different, but typically not in a
+way that matters to consumers. If you see any typescript errors as a direct
+result from this, they are compatible with each other in the ways that we
+interact with them, and should be possible to type-cast across without ill
+effects.
diff --git a/packages/backend-common/api-report.md b/packages/backend-common/api-report.md
index a063815056..784f3295c6 100644
--- a/packages/backend-common/api-report.md
+++ b/packages/backend-common/api-report.md
@@ -6,8 +6,6 @@
///
///
-import { AbortController as AbortController_2 } from 'node-abort-controller';
-import { AbortSignal as AbortSignal_2 } from 'node-abort-controller';
import aws from 'aws-sdk';
import { AwsS3Integration } from '@backstage/integration';
import { AzureIntegration } from '@backstage/integration';
@@ -200,7 +198,7 @@ export interface ContainerRunner {
// @alpha
export interface Context {
- readonly abortSignal: AbortSignal_2;
+ readonly abortSignal: AbortSignal;
readonly deadline: Date | undefined;
value(key: string): T | undefined;
}
@@ -210,7 +208,7 @@ export class Contexts {
static root(): Context;
static withAbort(
parentCtx: Context,
- source: AbortController_2 | AbortSignal_2,
+ source: AbortController | AbortSignal,
): Context;
static withTimeoutDuration(parentCtx: Context, timeout: Duration): Context;
static withTimeoutMillis(parentCtx: Context, timeout: number): Context;
@@ -544,7 +542,7 @@ export type ReadTreeOptions = {
},
): boolean;
etag?: string;
- signal?: AbortSignal_2;
+ signal?: AbortSignal;
};
// @public
@@ -598,7 +596,7 @@ export type ReadTreeResponseFile = {
// @public
export type ReadUrlOptions = {
etag?: string;
- signal?: AbortSignal_2;
+ signal?: AbortSignal;
};
// @public
@@ -657,7 +655,7 @@ export type RunContainerOptions = {
// @public
export type SearchOptions = {
etag?: string;
- signal?: AbortSignal_2;
+ signal?: AbortSignal;
};
// @public
diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json
index 9fadc0aeb7..2d9f02d576 100644
--- a/packages/backend-common/package.json
+++ b/packages/backend-common/package.json
@@ -73,7 +73,6 @@
"minimatch": "^5.0.0",
"minimist": "^1.2.5",
"morgan": "^1.10.0",
- "node-abort-controller": "^3.0.1",
"node-fetch": "^2.6.7",
"node-forge": "^1.3.1",
"raw-body": "^2.4.1",
diff --git a/packages/backend-common/src/context/AbortContext.test.ts b/packages/backend-common/src/context/AbortContext.test.ts
index f69e282d28..a6c522ffcf 100644
--- a/packages/backend-common/src/context/AbortContext.test.ts
+++ b/packages/backend-common/src/context/AbortContext.test.ts
@@ -14,7 +14,6 @@
* limitations under the License.
*/
-import { AbortController } from 'node-abort-controller';
import { AbortContext } from './AbortContext';
import { RootContext } from './RootContext';
diff --git a/packages/backend-common/src/context/AbortContext.ts b/packages/backend-common/src/context/AbortContext.ts
index 8a119358a6..92735fbcc6 100644
--- a/packages/backend-common/src/context/AbortContext.ts
+++ b/packages/backend-common/src/context/AbortContext.ts
@@ -14,7 +14,6 @@
* limitations under the License.
*/
-import { AbortController, AbortSignal } from 'node-abort-controller';
import { Context } from './types';
/**
diff --git a/packages/backend-common/src/context/Contexts.test.ts b/packages/backend-common/src/context/Contexts.test.ts
index cbd61d20a9..c895b3bb49 100644
--- a/packages/backend-common/src/context/Contexts.test.ts
+++ b/packages/backend-common/src/context/Contexts.test.ts
@@ -15,7 +15,6 @@
*/
import { Duration } from 'luxon';
-import { AbortController } from 'node-abort-controller';
import { Contexts } from './Contexts';
describe('Contexts', () => {
diff --git a/packages/backend-common/src/context/Contexts.ts b/packages/backend-common/src/context/Contexts.ts
index e22a76f673..4eeb56b029 100644
--- a/packages/backend-common/src/context/Contexts.ts
+++ b/packages/backend-common/src/context/Contexts.ts
@@ -15,7 +15,6 @@
*/
import { Duration } from 'luxon';
-import { AbortController, AbortSignal } from 'node-abort-controller';
import { AbortContext } from './AbortContext';
import { RootContext } from './RootContext';
import { Context } from './types';
diff --git a/packages/backend-common/src/context/RootContext.ts b/packages/backend-common/src/context/RootContext.ts
index 61962380a4..aa2213ccab 100644
--- a/packages/backend-common/src/context/RootContext.ts
+++ b/packages/backend-common/src/context/RootContext.ts
@@ -14,29 +14,36 @@
* limitations under the License.
*/
-import { AbortSignal } from 'node-abort-controller';
import { Context } from './types';
/**
- * Since the root context can never abort, and since nobody is every meant to
- * dispatch events through it, we can use a static dummy instance for
+ * Since the root context can never abort, and since nobody is ever meant to
+ * dispatch events through it, we can use a static fake instance for
* efficiency.
*/
-const dummyAbortSignal: AbortSignal = Object.freeze({
- aborted: false,
- addEventListener() {},
- removeEventListener() {},
- dispatchEvent() {
- return true;
- },
- onabort: null,
-});
+const fakeAbortController = new AbortController();
+const fakeAbortSignal: AbortSignal = Object.freeze(
+ Object.assign(
+ {
+ aborted: false,
+ reason: undefined,
+ throwIfAborted() {},
+ onabort() {},
+ addEventListener() {},
+ removeEventListener() {},
+ dispatchEvent() {
+ return true;
+ },
+ },
+ fakeAbortController.signal,
+ ),
+);
/**
* An empty root context.
*/
export class RootContext implements Context {
- readonly abortSignal = dummyAbortSignal;
+ readonly abortSignal = fakeAbortSignal;
readonly deadline = undefined;
value(_key: string): T | undefined {
diff --git a/packages/backend-common/src/context/ValueContext.ts b/packages/backend-common/src/context/ValueContext.ts
index 441aaec984..c8e4426d05 100644
--- a/packages/backend-common/src/context/ValueContext.ts
+++ b/packages/backend-common/src/context/ValueContext.ts
@@ -14,7 +14,6 @@
* limitations under the License.
*/
-import { AbortSignal } from 'node-abort-controller';
import { Context } from './types';
/**
diff --git a/packages/backend-common/src/context/types.ts b/packages/backend-common/src/context/types.ts
index 664745bbf6..3b53225163 100644
--- a/packages/backend-common/src/context/types.ts
+++ b/packages/backend-common/src/context/types.ts
@@ -14,8 +14,6 @@
* limitations under the License.
*/
-import { AbortSignal } from 'node-abort-controller';
-
/**
* A context that is meant to be passed as a ctx variable down the call chain,
* to pass along scoped information and abort signals.
diff --git a/packages/backend-common/src/reading/types.ts b/packages/backend-common/src/reading/types.ts
index 2ebf38c08a..bce737f3c7 100644
--- a/packages/backend-common/src/reading/types.ts
+++ b/packages/backend-common/src/reading/types.ts
@@ -17,7 +17,6 @@
import { Readable } from 'stream';
import { Logger } from 'winston';
import { Config } from '@backstage/config';
-import { AbortSignal } from 'node-abort-controller';
/**
* A generic interface for fetching plain data from URLs.
diff --git a/packages/backend-tasks/api-report.md b/packages/backend-tasks/api-report.md
index 8f53d1e5ae..f7b4782263 100644
--- a/packages/backend-tasks/api-report.md
+++ b/packages/backend-tasks/api-report.md
@@ -3,7 +3,6 @@
> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
```ts
-import { AbortSignal as AbortSignal_2 } from 'node-abort-controller';
import { Config } from '@backstage/config';
import { DatabaseManager } from '@backstage/backend-common';
import { Duration } from 'luxon';
@@ -29,14 +28,14 @@ export function readTaskScheduleDefinitionFromConfig(
// @public
export type TaskFunction =
- | ((abortSignal: AbortSignal_2) => void | Promise)
+ | ((abortSignal: AbortSignal) => void | Promise)
| (() => void | Promise);
// @public
export interface TaskInvocationDefinition {
fn: TaskFunction;
id: string;
- signal?: AbortSignal_2;
+ signal?: AbortSignal;
}
// @public
diff --git a/packages/backend-tasks/package.json b/packages/backend-tasks/package.json
index 1e209a4d10..78a29c122a 100644
--- a/packages/backend-tasks/package.json
+++ b/packages/backend-tasks/package.json
@@ -41,7 +41,6 @@
"knex": "^2.0.0",
"lodash": "^4.17.21",
"luxon": "^3.0.0",
- "node-abort-controller": "^3.0.1",
"uuid": "^8.0.0",
"winston": "^3.2.1",
"zod": "^3.9.5"
diff --git a/packages/backend-tasks/src/tasks/LocalTaskWorker.test.ts b/packages/backend-tasks/src/tasks/LocalTaskWorker.test.ts
index b81f7ab1c2..c46743ae59 100644
--- a/packages/backend-tasks/src/tasks/LocalTaskWorker.test.ts
+++ b/packages/backend-tasks/src/tasks/LocalTaskWorker.test.ts
@@ -15,7 +15,6 @@
*/
import { getVoidLogger } from '@backstage/backend-common';
-import { AbortController } from 'node-abort-controller';
import { LocalTaskWorker } from './LocalTaskWorker';
describe('LocalTaskWorker', () => {
diff --git a/packages/backend-tasks/src/tasks/LocalTaskWorker.ts b/packages/backend-tasks/src/tasks/LocalTaskWorker.ts
index be30988aa8..0edec5e84e 100644
--- a/packages/backend-tasks/src/tasks/LocalTaskWorker.ts
+++ b/packages/backend-tasks/src/tasks/LocalTaskWorker.ts
@@ -17,7 +17,6 @@
import { ConflictError } from '@backstage/errors';
import { CronTime } from 'cron';
import { DateTime, Duration } from 'luxon';
-import { AbortController, AbortSignal } from 'node-abort-controller';
import { Logger } from 'winston';
import { TaskFunction, TaskSettingsV2 } from './types';
import { delegateAbortController, sleep } from './util';
diff --git a/packages/backend-tasks/src/tasks/PluginTaskSchedulerImpl.test.ts b/packages/backend-tasks/src/tasks/PluginTaskSchedulerImpl.test.ts
index d61948a929..1847370d2b 100644
--- a/packages/backend-tasks/src/tasks/PluginTaskSchedulerImpl.test.ts
+++ b/packages/backend-tasks/src/tasks/PluginTaskSchedulerImpl.test.ts
@@ -18,7 +18,6 @@ import { getVoidLogger } from '@backstage/backend-common';
import { TestDatabaseId, TestDatabases } from '@backstage/backend-test-utils';
import { ConflictError, NotFoundError } from '@backstage/errors';
import { Duration } from 'luxon';
-import { AbortSignal } from 'node-abort-controller';
import { migrateBackendTasks } from '../database/migrateBackendTasks';
import {
parseDuration,
diff --git a/packages/backend-tasks/src/tasks/PluginTaskSchedulerJanitor.ts b/packages/backend-tasks/src/tasks/PluginTaskSchedulerJanitor.ts
index bedf03d08a..81b0345c2c 100644
--- a/packages/backend-tasks/src/tasks/PluginTaskSchedulerJanitor.ts
+++ b/packages/backend-tasks/src/tasks/PluginTaskSchedulerJanitor.ts
@@ -16,7 +16,6 @@
import { Knex } from 'knex';
import { Duration } from 'luxon';
-import { AbortSignal } from 'node-abort-controller';
import { Logger } from 'winston';
import { DbTasksRow, DB_TASKS_TABLE } from '../database/tables';
import { sleep } from './util';
diff --git a/packages/backend-tasks/src/tasks/TaskWorker.test.ts b/packages/backend-tasks/src/tasks/TaskWorker.test.ts
index e631dcce54..28dbcc4337 100644
--- a/packages/backend-tasks/src/tasks/TaskWorker.test.ts
+++ b/packages/backend-tasks/src/tasks/TaskWorker.test.ts
@@ -17,7 +17,6 @@
import { getVoidLogger } from '@backstage/backend-common';
import { TestDatabases } from '@backstage/backend-test-utils';
import { Duration } from 'luxon';
-import { AbortController } from 'node-abort-controller';
import waitForExpect from 'wait-for-expect';
import { migrateBackendTasks } from '../database/migrateBackendTasks';
import { DbTasksRow, DB_TASKS_TABLE } from '../database/tables';
diff --git a/packages/backend-tasks/src/tasks/TaskWorker.ts b/packages/backend-tasks/src/tasks/TaskWorker.ts
index f56c03c3d5..483fb1a02d 100644
--- a/packages/backend-tasks/src/tasks/TaskWorker.ts
+++ b/packages/backend-tasks/src/tasks/TaskWorker.ts
@@ -18,7 +18,6 @@ import { ConflictError, NotFoundError } from '@backstage/errors';
import { CronTime } from 'cron';
import { Knex } from 'knex';
import { DateTime, Duration } from 'luxon';
-import { AbortSignal } from 'node-abort-controller';
import { v4 as uuid } from 'uuid';
import { Logger } from 'winston';
import { DbTasksRow, DB_TASKS_TABLE } from '../database/tables';
diff --git a/packages/backend-tasks/src/tasks/types.ts b/packages/backend-tasks/src/tasks/types.ts
index dbf2595e1d..6ec5165aec 100644
--- a/packages/backend-tasks/src/tasks/types.ts
+++ b/packages/backend-tasks/src/tasks/types.ts
@@ -17,7 +17,6 @@
import { HumanDuration } from '@backstage/types';
import { CronTime } from 'cron';
import { Duration } from 'luxon';
-import { AbortSignal } from 'node-abort-controller';
import { z } from 'zod';
/**
diff --git a/packages/backend-tasks/src/tasks/util.test.ts b/packages/backend-tasks/src/tasks/util.test.ts
index ceeeba14d6..e17cf1ef1f 100644
--- a/packages/backend-tasks/src/tasks/util.test.ts
+++ b/packages/backend-tasks/src/tasks/util.test.ts
@@ -16,7 +16,6 @@
import knexFactory, { Knex } from 'knex';
import { Duration } from 'luxon';
-import { AbortController } from 'node-abort-controller';
import { delegateAbortController, nowPlus, sleep, validateId } from './util';
class KnexBuilder {
diff --git a/packages/backend-tasks/src/tasks/util.ts b/packages/backend-tasks/src/tasks/util.ts
index 2561203318..70d67a9fbe 100644
--- a/packages/backend-tasks/src/tasks/util.ts
+++ b/packages/backend-tasks/src/tasks/util.ts
@@ -17,7 +17,6 @@
import { InputError } from '@backstage/errors';
import { Knex } from 'knex';
import { DateTime, Duration } from 'luxon';
-import { AbortController, AbortSignal } from 'node-abort-controller';
// Keep the IDs compatible with e.g. Prometheus labels
export function validateId(id: string) {
diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/engine/IncrementalIngestionEngine.ts b/plugins/catalog-backend-module-incremental-ingestion/src/engine/IncrementalIngestionEngine.ts
index a742f63045..86c58b0082 100644
--- a/plugins/catalog-backend-module-incremental-ingestion/src/engine/IncrementalIngestionEngine.ts
+++ b/plugins/catalog-backend-module-incremental-ingestion/src/engine/IncrementalIngestionEngine.ts
@@ -21,7 +21,6 @@ import {
IterationEngineOptions,
} from '../types';
import { IncrementalIngestionDatabaseManager } from '../database/IncrementalIngestionDatabaseManager';
-import type { AbortSignal } from 'node-abort-controller';
import { performance } from 'perf_hooks';
import { Duration, DurationObjectUnits } from 'luxon';
import { v4 } from 'uuid';
diff --git a/plugins/search-backend-node/package.json b/plugins/search-backend-node/package.json
index 8a15127040..0122af5ae3 100644
--- a/plugins/search-backend-node/package.json
+++ b/plugins/search-backend-node/package.json
@@ -33,7 +33,6 @@
"lodash": "^4.17.21",
"lunr": "^2.3.9",
"ndjson": "^2.0.0",
- "node-abort-controller": "^3.0.1",
"uuid": "^8.3.2",
"winston": "^3.2.1"
},
diff --git a/plugins/search-backend-node/src/Scheduler.ts b/plugins/search-backend-node/src/Scheduler.ts
index 82d45df090..39c423263c 100644
--- a/plugins/search-backend-node/src/Scheduler.ts
+++ b/plugins/search-backend-node/src/Scheduler.ts
@@ -14,7 +14,6 @@
* limitations under the License.
*/
-import { AbortController } from 'node-abort-controller';
import { Logger } from 'winston';
import { TaskFunction, TaskRunner } from '@backstage/backend-tasks';
diff --git a/yarn.lock b/yarn.lock
index bc9afbb479..c41d9800c0 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3590,7 +3590,6 @@ __metadata:
morgan: ^1.10.0
msw: ^0.49.0
mysql2: ^2.2.5
- node-abort-controller: ^3.0.1
node-fetch: ^2.6.7
node-forge: ^1.3.1
raw-body: ^2.4.1
@@ -3654,7 +3653,6 @@ __metadata:
knex: ^2.0.0
lodash: ^4.17.21
luxon: ^3.0.0
- node-abort-controller: ^3.0.1
uuid: ^8.0.0
wait-for-expect: ^3.0.2
winston: ^3.2.1
@@ -7676,7 +7674,6 @@ __metadata:
lodash: ^4.17.21
lunr: ^2.3.9
ndjson: ^2.0.0
- node-abort-controller: ^3.0.1
uuid: ^8.3.2
winston: ^3.2.1
languageName: unknown