mirror of
https://github.com/nodejs/node.git
synced 2025-05-05 15:32:15 +00:00

Object.defineProperty is updated to lazily load the undici dependency for the fetch method. This change allows for simpler and more reliable mocking of the fetch method for testing purposes, resolving issues encountered with premature method invocation during testing. Fixes: https://github.com/nodejs/node/issues/52015 PR-URL: https://github.com/nodejs/node/pull/52275 Reviewed-By: Moshe Atlow <moshe@atlow.co.il> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Chemi Atlow <chemi@atlow.co.il> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
92 lines
3.4 KiB
JavaScript
92 lines
3.4 KiB
JavaScript
'use strict';
|
|
|
|
/**
|
|
* This file exposes web interfaces that is defined with the WebIDL
|
|
* Exposed=Window + Exposed=(Window,Worker) extended attribute or exposed in
|
|
* WindowOrWorkerGlobalScope mixin.
|
|
* See more details at https://webidl.spec.whatwg.org/#Exposed and
|
|
* https://html.spec.whatwg.org/multipage/webappapis.html#windoworworkerglobalscope.
|
|
*/
|
|
|
|
const {
|
|
globalThis,
|
|
ObjectDefineProperty,
|
|
} = primordials;
|
|
|
|
const {
|
|
defineOperation,
|
|
defineLazyProperties,
|
|
defineReplaceableLazyAttribute,
|
|
exposeLazyInterfaces,
|
|
} = require('internal/util');
|
|
|
|
// https://html.spec.whatwg.org/multipage/webappapis.html#windoworworkerglobalscope
|
|
const timers = require('timers');
|
|
defineOperation(globalThis, 'clearInterval', timers.clearInterval);
|
|
defineOperation(globalThis, 'clearTimeout', timers.clearTimeout);
|
|
defineOperation(globalThis, 'setInterval', timers.setInterval);
|
|
defineOperation(globalThis, 'setTimeout', timers.setTimeout);
|
|
|
|
const {
|
|
queueMicrotask,
|
|
} = require('internal/process/task_queues');
|
|
defineOperation(globalThis, 'queueMicrotask', queueMicrotask);
|
|
|
|
const { structuredClone } = internalBinding('messaging');
|
|
defineOperation(globalThis, 'structuredClone', structuredClone);
|
|
defineLazyProperties(globalThis, 'buffer', ['atob', 'btoa']);
|
|
|
|
// https://html.spec.whatwg.org/multipage/web-messaging.html#broadcasting-to-other-browsing-contexts
|
|
exposeLazyInterfaces(globalThis, 'internal/worker/io', ['BroadcastChannel']);
|
|
exposeLazyInterfaces(globalThis, 'internal/worker/io', [
|
|
'MessageChannel', 'MessagePort', 'MessageEvent',
|
|
]);
|
|
// https://www.w3.org/TR/FileAPI/#dfn-Blob
|
|
exposeLazyInterfaces(globalThis, 'internal/blob', ['Blob']);
|
|
// https://www.w3.org/TR/FileAPI/#dfn-file
|
|
exposeLazyInterfaces(globalThis, 'internal/file', ['File']);
|
|
// https://www.w3.org/TR/hr-time-2/#the-performance-attribute
|
|
exposeLazyInterfaces(globalThis, 'perf_hooks', [
|
|
'Performance', 'PerformanceEntry', 'PerformanceMark', 'PerformanceMeasure',
|
|
'PerformanceObserver', 'PerformanceObserverEntryList', 'PerformanceResourceTiming',
|
|
]);
|
|
|
|
defineReplaceableLazyAttribute(globalThis, 'perf_hooks', ['performance']);
|
|
|
|
// https://w3c.github.io/FileAPI/#creating-revoking
|
|
const { installObjectURLMethods } = require('internal/url');
|
|
installObjectURLMethods();
|
|
|
|
let fetchImpl;
|
|
// https://fetch.spec.whatwg.org/#fetch-method
|
|
ObjectDefineProperty(globalThis, 'fetch', {
|
|
__proto__: null,
|
|
configurable: true,
|
|
enumerable: true,
|
|
writable: true,
|
|
value: function value(input, init = undefined) {
|
|
if (!fetchImpl) { // Implement lazy loading of undici module for fetch function
|
|
const undiciModule = require('internal/deps/undici/undici');
|
|
fetchImpl = undiciModule.fetch;
|
|
}
|
|
return fetchImpl(input, init);
|
|
},
|
|
});
|
|
|
|
// https://xhr.spec.whatwg.org/#interface-formdata
|
|
// https://fetch.spec.whatwg.org/#headers-class
|
|
// https://fetch.spec.whatwg.org/#request-class
|
|
// https://fetch.spec.whatwg.org/#response-class
|
|
exposeLazyInterfaces(globalThis, 'internal/deps/undici/undici', [
|
|
'FormData', 'Headers', 'Request', 'Response',
|
|
]);
|
|
|
|
// https://websockets.spec.whatwg.org/
|
|
exposeLazyInterfaces(globalThis, 'internal/deps/undici/undici', ['WebSocket']);
|
|
|
|
// The WebAssembly Web API which relies on Response.
|
|
// https:// webassembly.github.io/spec/web-api/#streaming-modules
|
|
internalBinding('wasm_web_api').setImplementation((streamState, source) => {
|
|
require('internal/wasm_web_api').wasmStreamingCallback(streamState, source);
|
|
});
|