'use strict'; const { ObjectDefineProperty, globalThis, } = primordials; const { defineOperation, exposeInterface, lazyDOMExceptionClass, defineLazyProperties, defineReplaceableLazyAttribute, exposeLazyInterfaces, } = require('internal/util'); const config = internalBinding('config'); // https://console.spec.whatwg.org/#console-namespace exposeNamespace(globalThis, 'console', createGlobalConsole()); const { URL, URLSearchParams } = require('internal/url'); // https://url.spec.whatwg.org/#url exposeInterface(globalThis, 'URL', URL); // https://url.spec.whatwg.org/#urlsearchparams exposeInterface(globalThis, 'URLSearchParams', URLSearchParams); exposeGetterAndSetter(globalThis, 'DOMException', () => { const DOMException = lazyDOMExceptionClass(); exposeInterface(globalThis, 'DOMException', DOMException); return DOMException; }, (value) => { exposeInterface(globalThis, 'DOMException', value); }); // 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); // Lazy ones. exposeLazyInterfaces(globalThis, 'internal/worker/io', ['BroadcastChannel']); exposeLazyInterfaces(globalThis, 'internal/abort_controller', [ 'AbortController', 'AbortSignal', ]); const { EventTarget, Event, } = require('internal/event_target'); exposeInterface(globalThis, 'Event', Event); exposeInterface(globalThis, 'EventTarget', EventTarget); exposeLazyInterfaces(globalThis, 'internal/worker/io', [ 'MessageChannel', 'MessagePort', 'MessageEvent', ]); defineLazyProperties(globalThis, 'buffer', ['atob', 'btoa']); // https://www.w3.org/TR/FileAPI/#dfn-Blob exposeLazyInterfaces(globalThis, 'internal/blob', ['Blob']); // https://www.w3.org/TR/hr-time-2/#the-performance-attribute exposeLazyInterfaces(globalThis, 'perf_hooks', [ 'Performance', ]); defineReplaceableLazyAttribute(globalThis, 'perf_hooks', ['performance']); // https://encoding.spec.whatwg.org/#textencoder // https://encoding.spec.whatwg.org/#textdecoder exposeLazyInterfaces(globalThis, 'internal/encoding', ['TextEncoder', 'TextDecoder']); function createGlobalConsole() { const consoleFromNode = require('internal/console/global'); if (config.hasInspector) { const inspector = require('internal/util/inspector'); // TODO(joyeecheung): postpone this until the first time inspector // is activated. inspector.wrapConsole(consoleFromNode); const { setConsoleExtensionInstaller } = internalBinding('inspector'); // Setup inspector command line API. setConsoleExtensionInstaller(inspector.installConsoleExtensions); } return consoleFromNode; } // https://heycam.github.io/webidl/#es-namespaces function exposeNamespace(target, name, namespaceObject) { ObjectDefineProperty(target, name, { __proto__: null, writable: true, enumerable: false, configurable: true, value: namespaceObject, }); } function exposeGetterAndSetter(target, name, getter, setter = undefined) { ObjectDefineProperty(target, name, { __proto__: null, enumerable: false, configurable: true, get: getter, set: setter, }); } // Web Streams API exposeLazyInterfaces( globalThis, 'internal/webstreams/transformstream', ['TransformStream', 'TransformStreamDefaultController']); exposeLazyInterfaces( globalThis, 'internal/webstreams/writablestream', ['WritableStream', 'WritableStreamDefaultController', 'WritableStreamDefaultWriter']); exposeLazyInterfaces( globalThis, 'internal/webstreams/readablestream', [ 'ReadableStream', 'ReadableStreamDefaultReader', 'ReadableStreamBYOBReader', 'ReadableStreamBYOBRequest', 'ReadableByteStreamController', 'ReadableStreamDefaultController', ]); exposeLazyInterfaces( globalThis, 'internal/webstreams/queuingstrategies', [ 'ByteLengthQueuingStrategy', 'CountQueuingStrategy', ]); exposeLazyInterfaces( globalThis, 'internal/webstreams/encoding', [ 'TextEncoderStream', 'TextDecoderStream', ]); exposeLazyInterfaces( globalThis, 'internal/webstreams/compression', [ 'CompressionStream', 'DecompressionStream', ]);