summaryrefslogtreecommitdiff
path: root/ext/node/01_node.js
diff options
context:
space:
mode:
Diffstat (limited to 'ext/node/01_node.js')
-rw-r--r--ext/node/01_node.js111
1 files changed, 111 insertions, 0 deletions
diff --git a/ext/node/01_node.js b/ext/node/01_node.js
new file mode 100644
index 000000000..80fccf843
--- /dev/null
+++ b/ext/node/01_node.js
@@ -0,0 +1,111 @@
+// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
+
+// deno-lint-ignore-file
+
+"use strict";
+
+((window) => {
+ const {
+ ArrayPrototypePush,
+ ObjectEntries,
+ ObjectCreate,
+ } = window.__bootstrap.primordials;
+
+ function assert(cond) {
+ if (!cond) {
+ throw Error("assert");
+ }
+ }
+
+ let initialized = false;
+ const nodeGlobals = {};
+ const nodeGlobalThis = new Proxy(globalThis, {
+ get(_target, prop, _receiver) {
+ if (prop in nodeGlobals) {
+ return nodeGlobals[prop];
+ } else {
+ return globalThis[prop];
+ }
+ },
+ set(_target, prop, value) {
+ if (prop in nodeGlobals) {
+ nodeGlobals[prop] = value;
+ } else {
+ globalThis[prop] = value;
+ }
+ return true;
+ },
+ deleteProperty(_target, prop) {
+ let success = false;
+ if (prop in nodeGlobals) {
+ delete nodeGlobals[prop];
+ success = true;
+ }
+ if (prop in globalThis) {
+ delete globalThis[prop];
+ success = true;
+ }
+ return success;
+ },
+ ownKeys(_target) {
+ const globalThisKeys = Reflect.ownKeys(globalThis);
+ const nodeGlobalsKeys = Reflect.ownKeys(nodeGlobals);
+ const nodeGlobalsKeySet = new Set(nodeGlobalsKeys);
+ return [
+ ...ArrayPrototypeFilter(
+ globalThisKeys,
+ (k) => !nodeGlobalsKeySet.has(k),
+ ),
+ ...nodeGlobalsKeys,
+ ];
+ },
+ defineProperty(_target, prop, desc) {
+ if (prop in nodeGlobals) {
+ return Reflect.defineProperty(nodeGlobals, prop, desc);
+ } else {
+ return Reflect.defineProperty(globalThis, prop, desc);
+ }
+ },
+ getOwnPropertyDescriptor(_target, prop) {
+ if (prop in nodeGlobals) {
+ return Reflect.getOwnPropertyDescriptor(nodeGlobals, prop);
+ } else {
+ return Reflect.getOwnPropertyDescriptor(globalThis, prop);
+ }
+ },
+ has(_target, prop) {
+ return prop in nodeGlobals || prop in globalThis;
+ },
+ });
+
+ const nativeModuleExports = ObjectCreate(null);
+ const builtinModules = [];
+
+ function initialize(nodeModules) {
+ assert(!initialized);
+ initialized = true;
+ for (const [name, exports] of ObjectEntries(nodeModules)) {
+ nativeModuleExports[name] = exports;
+ ArrayPrototypePush(builtinModules, name);
+ }
+ nodeGlobals.Buffer = nativeModuleExports["buffer"].Buffer;
+ nodeGlobals.clearImmediate = nativeModuleExports["timers"].clearImmediate;
+ nodeGlobals.clearInterval = nativeModuleExports["timers"].clearInterval;
+ nodeGlobals.clearTimeout = nativeModuleExports["timers"].clearTimeout;
+ nodeGlobals.global = nodeGlobals;
+ nodeGlobals.process = nativeModuleExports["process"];
+ nodeGlobals.setImmediate = nativeModuleExports["timers"].setImmediate;
+ nodeGlobals.setInterval = nativeModuleExports["timers"].setInterval;
+ nodeGlobals.setTimeout = nativeModuleExports["timers"].setTimeout;
+ }
+
+ window.__bootstrap.internals = {
+ ...window.__bootstrap.internals ?? {},
+ node: {
+ globalThis: nodeGlobalThis,
+ initialize,
+ nativeModuleExports,
+ builtinModules,
+ },
+ };
+})(globalThis);