diff --git a/lib/util/promise.js b/lib/util/promise.js deleted file mode 100644 index 048f86e34ef..00000000000 --- a/lib/util/promise.js +++ /dev/null @@ -1,28 +0,0 @@ -'use strict' - -/** - * @template {*} T - * @typedef {Object} DeferredPromise - * @property {Promise} promise - * @property {(value?: T) => void} resolve - * @property {(reason?: any) => void} reject - */ - -/** - * @template {*} T - * @returns {DeferredPromise} An object containing a promise and its resolve/reject methods. - */ -function createDeferredPromise () { - let res - let rej - const promise = new Promise((resolve, reject) => { - res = resolve - rej = reject - }) - - return { promise, resolve: res, reject: rej } -} - -module.exports = { - createDeferredPromise -} diff --git a/lib/web/cache/cache.js b/lib/web/cache/cache.js index 10decbede6a..1f41a66a01b 100644 --- a/lib/web/cache/cache.js +++ b/lib/web/cache/cache.js @@ -10,8 +10,6 @@ const { cloneResponse, fromInnerResponse, getResponseState } = require('../fetch const { Request, fromInnerRequest, getRequestState } = require('../fetch/request') const { fetching } = require('../fetch/index') const { urlIsHttpHttpsScheme, readAllBytes } = require('../fetch/util') -const { createDeferredPromise } = require('../../util/promise') - /** * @see https://w3c.github.io/ServiceWorker/#dfn-cache-batch-operation * @typedef {Object} CacheBatchOperation @@ -153,7 +151,7 @@ class Cache { requestList.push(r) // 5.6 - const responsePromise = createDeferredPromise() + const responsePromise = Promise.withResolvers() // 5.7 fetchControllers.push(fetching({ @@ -231,7 +229,7 @@ class Cache { } // 7.5 - const cacheJobPromise = createDeferredPromise() + const cacheJobPromise = Promise.withResolvers() // 7.6.1 let errorData = null @@ -325,7 +323,7 @@ class Cache { const clonedResponse = cloneResponse(innerResponse) // 10. - const bodyReadPromise = createDeferredPromise() + const bodyReadPromise = Promise.withResolvers() // 11. if (innerResponse.body != null) { @@ -364,7 +362,7 @@ class Cache { } // 19.1 - const cacheJobPromise = createDeferredPromise() + const cacheJobPromise = Promise.withResolvers() // 19.2.1 let errorData = null @@ -427,7 +425,7 @@ class Cache { operations.push(operation) - const cacheJobPromise = createDeferredPromise() + const cacheJobPromise = Promise.withResolvers() let errorData = null let requestResponses @@ -483,7 +481,7 @@ class Cache { } // 4. - const promise = createDeferredPromise() + const promise = Promise.withResolvers() // 5. // 5.1 diff --git a/lib/web/fetch/body.js b/lib/web/fetch/body.js index 5d172496527..7e08b29fd6c 100644 --- a/lib/web/fetch/body.js +++ b/lib/web/fetch/body.js @@ -14,7 +14,6 @@ const { isErrored, isDisturbed } = require('node:stream') const { isUint8Array } = require('node:util/types') const { serializeAMimeType } = require('./data-url') const { multipartFormDataParser } = require('./formdata-parser') -const { createDeferredPromise } = require('../../util/promise') const { parseJSONFromBytes } = require('../infra') const { utf8DecodeBytes } = require('../../encoding') const { runtimeFeatures } = require('../../util/runtime-features.js') @@ -431,7 +430,7 @@ function consumeBody (object, convertBytesToJSValue, instance, getInternalState) } // 2. Let promise be a new promise. - const promise = createDeferredPromise() + const promise = Promise.withResolvers() // 3. Let errorSteps given error be to reject promise with error. const errorSteps = promise.reject diff --git a/lib/web/fetch/index.js b/lib/web/fetch/index.js index 2f19d0cb154..76fb8c46c63 100644 --- a/lib/web/fetch/index.js +++ b/lib/web/fetch/index.js @@ -64,7 +64,6 @@ const { getGlobalDispatcher } = require('../../global') const { webidl } = require('../webidl') const { STATUS_CODES } = require('node:http') const { bytesMatch } = require('../subresource-integrity/subresource-integrity') -const { createDeferredPromise } = require('../../util/promise') const { isomorphicEncode } = require('../infra') const { runtimeFeatures } = require('../../util/runtime-features') @@ -136,7 +135,7 @@ function fetch (input, init = undefined) { webidl.argumentLengthCheck(arguments, 1, 'globalThis.fetch') // 1. Let p be a new promise. - let p = createDeferredPromise() + let p = Promise.withResolvers() // 2. Let requestObject be the result of invoking the initial value of // Request as constructor with input and init as arguments. If this throws diff --git a/lib/web/websocket/stream/websocketstream.js b/lib/web/websocket/stream/websocketstream.js index ca40ad08dae..d8061658fd9 100644 --- a/lib/web/websocket/stream/websocketstream.js +++ b/lib/web/websocket/stream/websocketstream.js @@ -1,6 +1,5 @@ 'use strict' -const { createDeferredPromise } = require('../../../util/promise') const { environmentSettingsObject } = require('../../fetch/util') const { states, opcodes, sentCloseFrameState } = require('../constants') const { webidl } = require('../../webidl') @@ -21,11 +20,11 @@ class WebSocketStream { #url // Each WebSocketStream object has an associated opened promise , which is a promise. - /** @type {import('../../../util/promise').DeferredPromise} */ + /** @type {ReturnType} */ #openedPromise // Each WebSocketStream object has an associated closed promise , which is a promise. - /** @type {import('../../../util/promise').DeferredPromise} */ + /** @type {ReturnType} */ #closedPromise // Each WebSocketStream object has an associated readable stream , which is a ReadableStream . @@ -113,8 +112,8 @@ class WebSocketStream { this.#url = urlRecord.toString() // 6. Set this 's opened promise and closed promise to new promises. - this.#openedPromise = createDeferredPromise() - this.#closedPromise = createDeferredPromise() + this.#openedPromise = Promise.withResolvers() + this.#closedPromise = Promise.withResolvers() // 7. Apply backpressure to the WebSocket. // TODO @@ -202,7 +201,7 @@ class WebSocketStream { chunk = webidl.converters.WebSocketStreamWrite(chunk) // 1. Let promise be a new promise created in stream ’s relevant realm . - const promise = createDeferredPromise() + const promise = Promise.withResolvers() // 2. Let data be null. let data = null diff --git a/test/fetch/exiting.js b/test/fetch/exiting.js index 223af588c59..f624b7b354c 100644 --- a/test/fetch/exiting.js +++ b/test/fetch/exiting.js @@ -5,12 +5,10 @@ const { fetch } = require('../..') const { createServer } = require('node:http') const { closeServerAsPromise } = require('../utils/node-http') const { once } = require('node:events') -const { createDeferredPromise } = require('../../lib/util/promise') - test('abort the request on the other side if the stream is canceled', async (t) => { t.plan(1) - const promise = createDeferredPromise() + const promise = Promise.withResolvers() const server = createServer({ joinDuplicateHeaders: true }, (req, res) => { res.writeHead(200) diff --git a/test/fetch/issue-4105.js b/test/fetch/issue-4105.js index f9ac5001cd3..361cf4c7534 100644 --- a/test/fetch/issue-4105.js +++ b/test/fetch/issue-4105.js @@ -5,15 +5,13 @@ const { createServer } = require('node:http') const { test } = require('node:test') const { fetch } = require('../..') const { PerformanceObserver } = require('node:perf_hooks') -const { createDeferredPromise } = require('../../lib/util/promise') - const isAtLeastv22 = process.versions.node.split('.').map(Number)[0] >= 22 // https://github.com/nodejs/undici/issues/4105 test('markResourceTiming responseStatus is set', { skip: !isAtLeastv22 }, async (t) => { t.plan(1) - const promise = createDeferredPromise() + const promise = Promise.withResolvers() const server = createServer((req, res) => { res.statusCode = 200 diff --git a/test/web-platform-tests/runner/utils.mjs b/test/web-platform-tests/runner/utils.mjs index 8b97016cc22..b72eedc9c28 100644 --- a/test/web-platform-tests/runner/utils.mjs +++ b/test/web-platform-tests/runner/utils.mjs @@ -15,9 +15,3 @@ export function sanitizeUnpairedSurrogates (str) { function codeUnitStr (char) { return 'U+' + char.charCodeAt(0).toString(16) } - -/** - * @type {import('../../../lib/util/promise')['createDeferredPromise']} - */ -export const createDeferredPromise = - Promise.withResolvers?.bind(Promise) ?? (await import('../../../lib/util/promise.js')).createDeferredPromise diff --git a/test/web-platform-tests/wpt-runner.mjs b/test/web-platform-tests/wpt-runner.mjs index 702ad159cb0..ba162c964d9 100644 --- a/test/web-platform-tests/wpt-runner.mjs +++ b/test/web-platform-tests/wpt-runner.mjs @@ -6,8 +6,7 @@ import { join } from 'node:path' import { createInterface } from 'node:readline' import { debuglog } from 'node:util' import { - sanitizeUnpairedSurrogates, - createDeferredPromise + sanitizeUnpairedSurrogates } from './runner/utils.mjs' import * as jsondiffpatch from 'jsondiffpatch' @@ -121,8 +120,8 @@ async function ensureWPTCheckout () { } async function runWithTestUtil (testFunction) { - const { promise, resolve, reject } = createDeferredPromise() - const { promise: readyPromise, resolve: resolveReady, reject: rejectReady } = createDeferredPromise() + const { promise, resolve, reject } = Promise.withResolvers() + const { promise: readyPromise, resolve: resolveReady, reject: rejectReady } = Promise.withResolvers() const readyChecks = new Set() const serverUrl = 'http://web-platform.test:8000/' let serverResponding = false @@ -224,7 +223,7 @@ async function runWithTestUtil (testFunction) { function runSingleTest (url, options, expectation, timeout = 10000) { const startTime = Date.now() - const { promise, resolve, reject } = createDeferredPromise() + const { promise, resolve, reject } = Promise.withResolvers() // NODE_EXTRA_CA_CERTS is required for HTTPS/WSS pages, but it causes the // WebSocket-over-HTTP/2 WPT variants to exit without emitting harness output. const useExtraCACerts = !(url.pathname.startsWith('/websockets/') && url.searchParams.get('wpt_flags')?.includes('h2'))