From 832c0c347453ad394d7e1d1879897475b50ba689 Mon Sep 17 00:00:00 2001 From: Deyaaeldeen Almahallawi Date: Fri, 10 Feb 2023 10:48:50 -0800 Subject: [PATCH 1/8] [core-util] Abstract the abortable promise pattern --- sdk/core/core-util/package.json | 1 + sdk/core/core-util/src/delay.ts | 82 ++++++++++++++----- .../internal/createAbortablePromise.spec.ts | 43 ++++++++++ 3 files changed, 105 insertions(+), 21 deletions(-) create mode 100644 sdk/core/core-util/test/internal/createAbortablePromise.spec.ts diff --git a/sdk/core/core-util/package.json b/sdk/core/core-util/package.json index 34438169498d..c95ced5954a9 100644 --- a/sdk/core/core-util/package.json +++ b/sdk/core/core-util/package.json @@ -74,6 +74,7 @@ }, "devDependencies": { "@azure/dev-tool": "^1.0.0", + "@azure/test-utils": "^1.0.0", "@microsoft/api-extractor": "^7.31.1", "@types/chai": "^4.1.6", "@types/mocha": "^7.0.2", diff --git a/sdk/core/core-util/src/delay.ts b/sdk/core/core-util/src/delay.ts index 1ebe336fbee0..4bebe9cdcbb5 100644 --- a/sdk/core/core-util/src/delay.ts +++ b/sdk/core/core-util/src/delay.ts @@ -19,6 +19,55 @@ export interface DelayOptions { abortErrorMsg?: string; } +/** + * + * @param inputs - The inputs for creating an abortable promise are the + * buildPromise function and the cleanupBeforeAbort function. + * buildPromise takes both the resolve and reject functions as + * parameters. cleanupBeforeAbort is called right before the + * promise is rejected. + * @returns a function that takes an optional DelayOptions parameter and returns + * a promise that can be aborted. + * @internal + */ +export function createAbortablePromise(inputs: { + buildPromise: (inputs: { + resolve: (value: T | PromiseLike) => void; + reject: (reason?: any) => void; + }) => void; + cleanupBeforeAbort?: () => void; +}): (options?: DelayOptions) => Promise { + const { buildPromise, cleanupBeforeAbort } = inputs; + return ({ abortSignal, abortErrorMsg } = {}) => + new Promise((resolve, reject) => { + function rejectOnAbort(): void { + reject(new AbortError(abortErrorMsg ?? "The operation was aborted.")); + } + function removeListeners(): void { + abortSignal?.removeEventListener("abort", onAbort); + } + function onAbort(): void { + cleanupBeforeAbort?.(); + removeListeners(); + rejectOnAbort(); + } + if (abortSignal?.aborted) { + return rejectOnAbort(); + } + buildPromise({ + resolve: (x) => { + resolve(x); + removeListeners(); + }, + reject: (x) => { + removeListeners(); + reject(x); + }, + }); + abortSignal?.addEventListener("abort", onAbort); + }); +} + /** * A wrapper for setTimeout that resolves a promise after timeInMs milliseconds. * @param timeInMs - The number of milliseconds to be delayed. @@ -26,26 +75,17 @@ export interface DelayOptions { * @returns Promise that is resolved after timeInMs */ export function delay(timeInMs: number, options?: DelayOptions): Promise { - return new Promise((resolve, reject) => { - function rejectOnAbort(): void { - reject(new AbortError(options?.abortErrorMsg ?? StandardAbortMessage)); - } - function removeListeners(): void { - options?.abortSignal?.removeEventListener("abort", onAbort); - } - function onAbort(): void { - // eslint-disable-next-line @typescript-eslint/no-use-before-define - clearTimeout(token); - removeListeners(); - rejectOnAbort(); - } - if (options?.abortSignal?.aborted) { - return rejectOnAbort(); - } - const token = setTimeout(() => { - removeListeners(); - resolve(); - }, timeInMs); - options?.abortSignal?.addEventListener("abort", onAbort); + let token: ReturnType; + const { abortSignal, abortErrorMsg } = options || {}; + return createAbortablePromise({ + buildPromise: ({ resolve }) => { + token = setTimeout(() => { + resolve(); + }, timeInMs); + }, + cleanupBeforeAbort: () => clearTimeout(token), + })({ + abortSignal, + abortErrorMsg: abortErrorMsg ?? StandardAbortMessage, }); } diff --git a/sdk/core/core-util/test/internal/createAbortablePromise.spec.ts b/sdk/core/core-util/test/internal/createAbortablePromise.spec.ts new file mode 100644 index 000000000000..702a51e0f712 --- /dev/null +++ b/sdk/core/core-util/test/internal/createAbortablePromise.spec.ts @@ -0,0 +1,43 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import * as sinon from "sinon"; +import { AbortController } from "@azure/abort-controller"; +import { assert } from "@azure/test-utils"; +import { createAbortablePromise } from "../../src/delay"; + +describe("createAbortablePromise", function () { + let token: ReturnType; + const delayTime = 2500; + const createPromise = createAbortablePromise({ + buildPromise: ({ resolve }) => { + token = setTimeout(() => { + resolve(); + }, delayTime); + }, + cleanupBeforeAbort: () => clearTimeout(token), + }); + afterEach(function () { + sinon.restore(); + }); + + it("should resolve if not aborted nor rejected", async function () { + const clock = sinon.useFakeTimers(); + const promise = createPromise(); + const time = await clock.nextAsync(); + clock.restore(); + assert.strictEqual(time, delayTime); + await promise; + }); + + it("should reject when aborted", async function () { + const aborter = new AbortController(); + const abortErrorMsg = "The operation was aborted."; + const promise = createPromise({ + abortSignal: aborter.signal, + abortErrorMsg, + }); + aborter.abort(); + assert.isRejected(promise, new RegExp(abortErrorMsg)); + }); +}); From 9b68f296199af6bd31bd5ff5c19d31cb93b068cc Mon Sep 17 00:00:00 2001 From: Deyaaeldeen Almahallawi Date: Fri, 10 Feb 2023 10:55:54 -0800 Subject: [PATCH 2/8] await promise in unit test --- .../core-util/test/internal/createAbortablePromise.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/core/core-util/test/internal/createAbortablePromise.spec.ts b/sdk/core/core-util/test/internal/createAbortablePromise.spec.ts index 702a51e0f712..8910733805b4 100644 --- a/sdk/core/core-util/test/internal/createAbortablePromise.spec.ts +++ b/sdk/core/core-util/test/internal/createAbortablePromise.spec.ts @@ -27,7 +27,7 @@ describe("createAbortablePromise", function () { const time = await clock.nextAsync(); clock.restore(); assert.strictEqual(time, delayTime); - await promise; + await assert.isFulfilled(promise); }); it("should reject when aborted", async function () { @@ -38,6 +38,6 @@ describe("createAbortablePromise", function () { abortErrorMsg, }); aborter.abort(); - assert.isRejected(promise, new RegExp(abortErrorMsg)); + await assert.isRejected(promise, new RegExp(abortErrorMsg)); }); }); From 7fdc6d9f953431996015fa0c74fddd2b3fb8b7c0 Mon Sep 17 00:00:00 2001 From: Deyaaeldeen Almahallawi Date: Fri, 10 Feb 2023 11:05:01 -0800 Subject: [PATCH 3/8] simplify client code --- sdk/core/core-util/src/delay.ts | 4 +--- .../core-util/test/internal/createAbortablePromise.spec.ts | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/sdk/core/core-util/src/delay.ts b/sdk/core/core-util/src/delay.ts index 4bebe9cdcbb5..c7e173e1b529 100644 --- a/sdk/core/core-util/src/delay.ts +++ b/sdk/core/core-util/src/delay.ts @@ -79,9 +79,7 @@ export function delay(timeInMs: number, options?: DelayOptions): Promise { const { abortSignal, abortErrorMsg } = options || {}; return createAbortablePromise({ buildPromise: ({ resolve }) => { - token = setTimeout(() => { - resolve(); - }, timeInMs); + token = setTimeout(resolve, timeInMs); }, cleanupBeforeAbort: () => clearTimeout(token), })({ diff --git a/sdk/core/core-util/test/internal/createAbortablePromise.spec.ts b/sdk/core/core-util/test/internal/createAbortablePromise.spec.ts index 8910733805b4..7d19b87e57de 100644 --- a/sdk/core/core-util/test/internal/createAbortablePromise.spec.ts +++ b/sdk/core/core-util/test/internal/createAbortablePromise.spec.ts @@ -11,9 +11,7 @@ describe("createAbortablePromise", function () { const delayTime = 2500; const createPromise = createAbortablePromise({ buildPromise: ({ resolve }) => { - token = setTimeout(() => { - resolve(); - }, delayTime); + token = setTimeout(resolve, delayTime); }, cleanupBeforeAbort: () => clearTimeout(token), }); From b6ef8d8b07141be33ca11bc7012cf7e031d16619 Mon Sep 17 00:00:00 2001 From: Deyaaeldeen Almahallawi Date: Fri, 10 Feb 2023 11:35:07 -0800 Subject: [PATCH 4/8] fix cyclic dependency error --- common/config/rush/pnpm-lock.yaml | 16 +++++++++------- sdk/core/core-util/package.json | 3 ++- .../test/internal/createAbortablePromise.spec.ts | 6 +++++- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 035065ca35d2..39b5eaba737e 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -3894,7 +3894,7 @@ packages: dependencies: semver: 7.3.8 shelljs: 0.8.5 - typescript: 5.0.0-dev.20230208 + typescript: 5.0.0-dev.20230210 dev: false /downlevel-dts/0.7.0: @@ -8779,8 +8779,8 @@ packages: hasBin: true dev: false - /typescript/5.0.0-dev.20230208: - resolution: {integrity: sha512-FkUy5kJ7XmLYxej9g9Lq4FMw3P6YjKuesa+1YoLvz2lHZuRuf91VxLsj9DWtknGCmjOVvyu+eefaeVknGTiI/Q==} + /typescript/5.0.0-dev.20230210: + resolution: {integrity: sha512-FjXPw8PFeIuT1cxouvP4LRu8J1G+FsWVEGwlJ9GcVywRNDfD3Hh6flQFUympS+3QnAIiG/+CHs9ZS2EQIT733g==} engines: {node: '>=4.2.0'} hasBin: true dev: false @@ -9540,7 +9540,7 @@ packages: dev: false file:projects/ai-language-conversations.tgz: - resolution: {integrity: sha512-yY5M/gHRLivJs1GxX0ON4tUQ4cHf5jopKrZXfcYjbpPYH4dAIStK1QeWFiG3S79MQ7fTNJMCQb/7RhIL3Gtnrw==, tarball: file:projects/ai-language-conversations.tgz} + resolution: {integrity: sha512-BC/j++g/PniHxRt71g8JwkBoi/8VY4QtE6jGA9H4DXcQkptS8F425OsM1rxIzEvFkLnlXPn0voeCHsEKgt9teg==, tarball: file:projects/ai-language-conversations.tgz} name: '@rush-temp/ai-language-conversations' version: 0.0.0 dependencies: @@ -15755,7 +15755,7 @@ packages: dev: false file:projects/communication-network-traversal.tgz: - resolution: {integrity: sha512-EvMiSy2kO8Rqsti4PvmNyb9ftsF47yNGKh857/IbNscxHRSBi73Dbu84ayET/UvRCqTKLwyA2rBLMBs3hM4zaw==, tarball: file:projects/communication-network-traversal.tgz} + resolution: {integrity: sha512-j/4HA05kscsrZahh1azdeLjO8ATvGcDxr45jHC30HmwGAkMXjc5ukuNq6yI8TPvwrAPqgKry5uY65kfhISTIUQ==, tarball: file:projects/communication-network-traversal.tgz} name: '@rush-temp/communication-network-traversal' version: 0.0.0 dependencies: @@ -16483,16 +16483,18 @@ packages: dev: false file:projects/core-util.tgz: - resolution: {integrity: sha512-FkPZZQzYvVGk7cUsJK7FfpbGrSbXGzJGcrU7t8DbWFVdxUpg7XPV07woocPHb4ls8SL9EOXkOcWONyo1oxq8tA==, tarball: file:projects/core-util.tgz} + resolution: {integrity: sha512-ls9WIyXDKJV4cNotjJO+kOzz8YrgYkYQJRTh5+rih0ilTbXnESQEeYvU4lFbx070XnszCOnbVEFg3Oli7UKvRA==, tarball: file:projects/core-util.tgz} name: '@rush-temp/core-util' version: 0.0.0 dependencies: '@microsoft/api-extractor': 7.34.3_@types+node@14.18.36 '@types/chai': 4.3.4 + '@types/chai-as-promised': 7.1.5 '@types/mocha': 7.0.2 '@types/node': 14.18.36 '@types/sinon': 9.0.11 chai: 4.3.7 + chai-as-promised: 7.1.1_chai@4.3.7 cross-env: 7.0.3 downlevel-dts: 0.10.1 eslint: 8.33.0 @@ -17192,7 +17194,7 @@ packages: dev: false file:projects/identity.tgz: - resolution: {integrity: sha512-brF7QRLqUk7tKTDBJoHl35fVdUUJ9uK98o4/oMYrweDl+ZYc6onnpV4CPOxecFeVzz+P2JkgmgRIazQ7XIK5bg==, tarball: file:projects/identity.tgz} + resolution: {integrity: sha512-eKTRjpsseEkPzt/cDZQG2h1k2xQceTqrKhg9LnYC64/e11VhthO824QCA0kwNMxRI1m3vy1D07UGwXEOap8x3A==, tarball: file:projects/identity.tgz} name: '@rush-temp/identity' version: 0.0.0 dependencies: diff --git a/sdk/core/core-util/package.json b/sdk/core/core-util/package.json index c95ced5954a9..7eaf4295aede 100644 --- a/sdk/core/core-util/package.json +++ b/sdk/core/core-util/package.json @@ -74,14 +74,15 @@ }, "devDependencies": { "@azure/dev-tool": "^1.0.0", - "@azure/test-utils": "^1.0.0", "@microsoft/api-extractor": "^7.31.1", "@types/chai": "^4.1.6", + "@types/chai-as-promised": "^7.1.4", "@types/mocha": "^7.0.2", "@types/node": "^14.0.0", "@types/sinon": "^9.0.4", "@azure/eslint-plugin-azure-sdk": "^3.0.0", "chai": "^4.2.0", + "chai-as-promised": "^7.1.1", "downlevel-dts": "^0.10.0", "cross-env": "^7.0.2", "eslint": "^8.0.0", diff --git a/sdk/core/core-util/test/internal/createAbortablePromise.spec.ts b/sdk/core/core-util/test/internal/createAbortablePromise.spec.ts index 7d19b87e57de..43b03ffb58eb 100644 --- a/sdk/core/core-util/test/internal/createAbortablePromise.spec.ts +++ b/sdk/core/core-util/test/internal/createAbortablePromise.spec.ts @@ -3,9 +3,13 @@ import * as sinon from "sinon"; import { AbortController } from "@azure/abort-controller"; -import { assert } from "@azure/test-utils"; +import chai from "chai"; +import chaiAsPromised from "chai-as-promised"; import { createAbortablePromise } from "../../src/delay"; +chai.use(chaiAsPromised); +const { assert } = chai; + describe("createAbortablePromise", function () { let token: ReturnType; const delayTime = 2500; From d36e462946e09eb17281872531fe683c4b565aee Mon Sep 17 00:00:00 2001 From: Deyaaeldeen Almahallawi Date: Fri, 10 Feb 2023 11:38:49 -0800 Subject: [PATCH 5/8] address feedback --- sdk/core/core-util/src/delay.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/core/core-util/src/delay.ts b/sdk/core/core-util/src/delay.ts index c7e173e1b529..9eaa23208f40 100644 --- a/sdk/core/core-util/src/delay.ts +++ b/sdk/core/core-util/src/delay.ts @@ -56,8 +56,8 @@ export function createAbortablePromise(inputs: { } buildPromise({ resolve: (x) => { - resolve(x); removeListeners(); + resolve(x); }, reject: (x) => { removeListeners(); From 64ea6c224b318c12ba37a1b94c45567f983e532c Mon Sep 17 00:00:00 2001 From: Deyaaeldeen Almahallawi Date: Fri, 10 Feb 2023 15:02:06 -0800 Subject: [PATCH 6/8] address feedback --- sdk/core/core-util/src/delay.ts | 97 ++++++++++--------- .../internal/createAbortablePromise.spec.ts | 26 +++-- 2 files changed, 68 insertions(+), 55 deletions(-) diff --git a/sdk/core/core-util/src/delay.ts b/sdk/core/core-util/src/delay.ts index 9eaa23208f40..3583f264ecb7 100644 --- a/sdk/core/core-util/src/delay.ts +++ b/sdk/core/core-util/src/delay.ts @@ -20,52 +20,56 @@ export interface DelayOptions { } /** - * - * @param inputs - The inputs for creating an abortable promise are the - * buildPromise function and the cleanupBeforeAbort function. - * buildPromise takes both the resolve and reject functions as - * parameters. cleanupBeforeAbort is called right before the - * promise is rejected. - * @returns a function that takes an optional DelayOptions parameter and returns - * a promise that can be aborted. + * Creates an abortable promise. + * @param buildPromise - A function that takes the resolve and reject functions as parameters. + * @param options - The options for the abortable promise. + * @returns A promise that can be aborted. * @internal */ -export function createAbortablePromise(inputs: { - buildPromise: (inputs: { - resolve: (value: T | PromiseLike) => void; - reject: (reason?: any) => void; - }) => void; - cleanupBeforeAbort?: () => void; -}): (options?: DelayOptions) => Promise { - const { buildPromise, cleanupBeforeAbort } = inputs; - return ({ abortSignal, abortErrorMsg } = {}) => - new Promise((resolve, reject) => { - function rejectOnAbort(): void { - reject(new AbortError(abortErrorMsg ?? "The operation was aborted.")); - } - function removeListeners(): void { - abortSignal?.removeEventListener("abort", onAbort); - } - function onAbort(): void { - cleanupBeforeAbort?.(); - removeListeners(); - rejectOnAbort(); - } - if (abortSignal?.aborted) { - return rejectOnAbort(); - } - buildPromise({ - resolve: (x) => { +export function createAbortablePromise( + buildPromise: ( + resolve: (value: T | PromiseLike) => void, + reject: (reason?: any) => void + ) => void, + options: { + cleanupBeforeAbort?: () => void; + abortSignal?: AbortSignalLike; + abortErrorMsg?: string; + } +): Promise { + const { cleanupBeforeAbort, abortSignal, abortErrorMsg } = options; + return new Promise((resolve, reject) => { + function rejectOnAbort(): void { + reject(new AbortError(abortErrorMsg ?? "The operation was aborted.")); + } + function removeListeners(): void { + abortSignal?.removeEventListener("abort", onAbort); + } + function onAbort(): void { + cleanupBeforeAbort?.(); + removeListeners(); + rejectOnAbort(); + } + if (abortSignal?.aborted) { + return rejectOnAbort(); + } + try { + buildPromise( + (x) => { removeListeners(); resolve(x); }, - reject: (x) => { + (x) => { removeListeners(); reject(x); - }, - }); - abortSignal?.addEventListener("abort", onAbort); - }); + } + ); + } catch (err) { + reject(err); + } + + abortSignal?.addEventListener("abort", onAbort); + }); } /** @@ -77,13 +81,14 @@ export function createAbortablePromise(inputs: { export function delay(timeInMs: number, options?: DelayOptions): Promise { let token: ReturnType; const { abortSignal, abortErrorMsg } = options || {}; - return createAbortablePromise({ - buildPromise: ({ resolve }) => { + return createAbortablePromise( + (resolve) => { token = setTimeout(resolve, timeInMs); }, - cleanupBeforeAbort: () => clearTimeout(token), - })({ - abortSignal, - abortErrorMsg: abortErrorMsg ?? StandardAbortMessage, - }); + { + cleanupBeforeAbort: () => clearTimeout(token), + abortSignal, + abortErrorMsg: abortErrorMsg ?? StandardAbortMessage, + } + ); } diff --git a/sdk/core/core-util/test/internal/createAbortablePromise.spec.ts b/sdk/core/core-util/test/internal/createAbortablePromise.spec.ts index 43b03ffb58eb..d5cf00bea5ad 100644 --- a/sdk/core/core-util/test/internal/createAbortablePromise.spec.ts +++ b/sdk/core/core-util/test/internal/createAbortablePromise.spec.ts @@ -2,7 +2,7 @@ // Licensed under the MIT license. import * as sinon from "sinon"; -import { AbortController } from "@azure/abort-controller"; +import { AbortController, AbortSignalLike } from "@azure/abort-controller"; import chai from "chai"; import chaiAsPromised from "chai-as-promised"; import { createAbortablePromise } from "../../src/delay"; @@ -13,12 +13,20 @@ const { assert } = chai; describe("createAbortablePromise", function () { let token: ReturnType; const delayTime = 2500; - const createPromise = createAbortablePromise({ - buildPromise: ({ resolve }) => { - token = setTimeout(resolve, delayTime); - }, - cleanupBeforeAbort: () => clearTimeout(token), - }); + const createPromise = ({ + abortSignal, + abortErrorMsg, + }: { abortSignal?: AbortSignalLike; abortErrorMsg?: string } = {}) => + createAbortablePromise( + (resolve) => { + token = setTimeout(resolve, delayTime); + }, + { + cleanupBeforeAbort: () => clearTimeout(token), + abortSignal, + abortErrorMsg, + } + ); afterEach(function () { sinon.restore(); }); @@ -34,12 +42,12 @@ describe("createAbortablePromise", function () { it("should reject when aborted", async function () { const aborter = new AbortController(); - const abortErrorMsg = "The operation was aborted."; + const abortErrorMsg = "The test operation was aborted."; const promise = createPromise({ abortSignal: aborter.signal, abortErrorMsg, }); aborter.abort(); - await assert.isRejected(promise, new RegExp(abortErrorMsg)); + await assert.isRejected(promise, abortErrorMsg); }); }); From 9d2e4ad79ec74d9165f675ca248fec86646d25c2 Mon Sep 17 00:00:00 2001 From: Deyaaeldeen Almahallawi Date: Fri, 10 Feb 2023 16:08:36 -0800 Subject: [PATCH 7/8] edit --- sdk/core/core-util/src/delay.ts | 7 +++---- .../core-util/test/internal/createAbortablePromise.spec.ts | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/sdk/core/core-util/src/delay.ts b/sdk/core/core-util/src/delay.ts index 3583f264ecb7..7c636dd6f37e 100644 --- a/sdk/core/core-util/src/delay.ts +++ b/sdk/core/core-util/src/delay.ts @@ -31,13 +31,13 @@ export function createAbortablePromise( resolve: (value: T | PromiseLike) => void, reject: (reason?: any) => void ) => void, - options: { + options?: { cleanupBeforeAbort?: () => void; abortSignal?: AbortSignalLike; abortErrorMsg?: string; } ): Promise { - const { cleanupBeforeAbort, abortSignal, abortErrorMsg } = options; + const { cleanupBeforeAbort, abortSignal, abortErrorMsg } = options ?? {}; return new Promise((resolve, reject) => { function rejectOnAbort(): void { reject(new AbortError(abortErrorMsg ?? "The operation was aborted.")); @@ -67,7 +67,6 @@ export function createAbortablePromise( } catch (err) { reject(err); } - abortSignal?.addEventListener("abort", onAbort); }); } @@ -81,7 +80,7 @@ export function createAbortablePromise( export function delay(timeInMs: number, options?: DelayOptions): Promise { let token: ReturnType; const { abortSignal, abortErrorMsg } = options || {}; - return createAbortablePromise( + return createAbortablePromise( (resolve) => { token = setTimeout(resolve, timeInMs); }, diff --git a/sdk/core/core-util/test/internal/createAbortablePromise.spec.ts b/sdk/core/core-util/test/internal/createAbortablePromise.spec.ts index d5cf00bea5ad..45f19f49e3aa 100644 --- a/sdk/core/core-util/test/internal/createAbortablePromise.spec.ts +++ b/sdk/core/core-util/test/internal/createAbortablePromise.spec.ts @@ -17,7 +17,7 @@ describe("createAbortablePromise", function () { abortSignal, abortErrorMsg, }: { abortSignal?: AbortSignalLike; abortErrorMsg?: string } = {}) => - createAbortablePromise( + createAbortablePromise( (resolve) => { token = setTimeout(resolve, delayTime); }, From 683008d5b3cf02502eba86eda68954e623968085 Mon Sep 17 00:00:00 2001 From: Deyaaeldeen Almahallawi Date: Mon, 13 Feb 2023 15:20:14 -0500 Subject: [PATCH 8/8] Update sdk/core/core-util/src/delay.ts Co-authored-by: Jeff Fisher --- sdk/core/core-util/src/delay.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/core/core-util/src/delay.ts b/sdk/core/core-util/src/delay.ts index 7c636dd6f37e..f86b860f249d 100644 --- a/sdk/core/core-util/src/delay.ts +++ b/sdk/core/core-util/src/delay.ts @@ -79,7 +79,7 @@ export function createAbortablePromise( */ export function delay(timeInMs: number, options?: DelayOptions): Promise { let token: ReturnType; - const { abortSignal, abortErrorMsg } = options || {}; + const { abortSignal, abortErrorMsg } = options ?? {}; return createAbortablePromise( (resolve) => { token = setTimeout(resolve, timeInMs);