From 01ee0127f16d3b521a384757734cb3fd95adc0cd Mon Sep 17 00:00:00 2001 From: Asier Isayas Date: Wed, 12 Feb 2025 12:47:05 -0500 Subject: [PATCH] Cancel Phoenix container allocation on ctrl+c --- package-lock.json | 51 ++++++++++++++++++++++++++++++++---- package.json | 2 +- src/Phoenix/PhoenixClient.ts | 16 +++++++++++ 3 files changed, 63 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 97106a145..2b1c80df0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -86,7 +86,7 @@ "mkdirp": "1.0.4", "monaco-editor": "0.44.0", "ms": "2.1.3", - "p-retry": "4.6.2", + "p-retry": "6.2.1", "patch-package": "8.0.0", "plotly.js-cartesian-dist-min": "1.52.3", "post-robot": "10.0.42", @@ -12662,7 +12662,9 @@ } }, "node_modules/@types/retry": { - "version": "0.12.0", + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", "license": "MIT" }, "node_modules/@types/sanitize-html": { @@ -21799,6 +21801,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-network-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", + "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-number": { "version": "3.0.0", "license": "MIT", @@ -30243,14 +30257,20 @@ } }, "node_modules/p-retry": { - "version": "4.6.2", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", + "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", "license": "MIT", "dependencies": { - "@types/retry": "0.12.0", + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", "retry": "^0.13.1" }, "engines": { - "node": ">=8" + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-try": { @@ -35997,6 +36017,13 @@ } } }, + "node_modules/webpack-dev-server/node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true, + "license": "MIT" + }, "node_modules/webpack-dev-server/node_modules/ajv": { "version": "8.12.0", "dev": true, @@ -36044,6 +36071,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/webpack-dev-server/node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/webpack-dev-server/node_modules/rimraf": { "version": "3.0.2", "dev": true, diff --git a/package.json b/package.json index 2b984ca47..f4b10a66d 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "mkdirp": "1.0.4", "monaco-editor": "0.44.0", "ms": "2.1.3", - "p-retry": "4.6.2", + "p-retry": "6.2.1", "patch-package": "8.0.0", "plotly.js-cartesian-dist-min": "1.52.3", "post-robot": "10.0.42", diff --git a/src/Phoenix/PhoenixClient.ts b/src/Phoenix/PhoenixClient.ts index d5e304b8e..3357c53fd 100644 --- a/src/Phoenix/PhoenixClient.ts +++ b/src/Phoenix/PhoenixClient.ts @@ -40,16 +40,21 @@ export class PhoenixClient { maxTimeout: Notebook.retryAttemptDelayMs, minTimeout: Notebook.retryAttemptDelayMs, }; + private abortController: AbortController; + private abortSignal: AbortSignal; constructor(armResourceId: string) { this.armResourceId = armResourceId; } public async allocateContainer(provisionData: IProvisionData): Promise> { + this.initializeCancelEventListener(); + return promiseRetry(() => this.executeContainerAssignmentOperation(provisionData, "allocate"), { retries: 4, maxTimeout: 20000, minTimeout: 20000, + signal: this.abortSignal, }); } @@ -270,6 +275,17 @@ export class PhoenixClient { }; } + private initializeCancelEventListener(): void { + this.abortController = new AbortController(); + this.abortSignal = this.abortController.signal; + + document.addEventListener("keydown", (event: KeyboardEvent) => { + if (event.ctrlKey && event.key === "c") { + this.abortController.abort(new AbortError("Request canceled")); + } + }); + } + public ConvertToForbiddenErrorString(jsonData: IPhoenixError): string { const errInfo = jsonData; switch (errInfo?.type) {