summaryrefslogtreecommitdiff
path: root/ext/node/polyfills/internal
diff options
context:
space:
mode:
authorLuca Casonato <hello@lcas.dev>2024-09-05 09:22:52 +0200
committerGitHub <noreply@github.com>2024-09-05 09:22:52 +0200
commit49e3ee010c7d4423fbab89bf12749235e156c9be (patch)
tree92185d6cf32a94ae4b241a23a64309bec3f92e59 /ext/node/polyfills/internal
parent17b5e98b822dc23407a0292dcf61e624fbf2a4b1 (diff)
feat(ext/node): add abort helpers, process & streams fix (#25262)
This commit adds: - `addAbortListener` in `node:events` - `aborted` in `node:util` - `execPath` and `execvArgs` named export from `node:process` - `getDefaultHighWaterMark` from `node:stream` The `execPath` is very hacky - because module namespaces can not have real getters, `execPath` is an object with a `toString()` method that on call returns the actual `execPath`, and replaces the `execPath` binding with the string. This is done so that we don't require the `execPath` permission on startup.
Diffstat (limited to 'ext/node/polyfills/internal')
-rw-r--r--ext/node/polyfills/internal/events/abort_listener.mjs44
1 files changed, 44 insertions, 0 deletions
diff --git a/ext/node/polyfills/internal/events/abort_listener.mjs b/ext/node/polyfills/internal/events/abort_listener.mjs
new file mode 100644
index 000000000..f1430489f
--- /dev/null
+++ b/ext/node/polyfills/internal/events/abort_listener.mjs
@@ -0,0 +1,44 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+// Copyright Joyent, Inc. and Node.js contributors. All rights reserved. MIT license.
+
+import { primordials } from "ext:deno_node/internal/test/binding.ts";
+const { queueMicrotask } = primordials;
+import { SymbolDispose } from "ext:deno_web/00_infra.js";
+import * as abortSignal from "ext:deno_web/03_abort_signal.js";
+import { validateAbortSignal, validateFunction } from "../validators.mjs";
+import { codes } from "../errors.ts";
+const { ERR_INVALID_ARG_TYPE } = codes;
+
+/**
+ * @param {AbortSignal} signal
+ * @param {EventListener} listener
+ * @returns {Disposable}
+ */
+function addAbortListener(signal, listener) {
+ if (signal === undefined) {
+ throw new ERR_INVALID_ARG_TYPE("signal", "AbortSignal", signal);
+ }
+ validateAbortSignal(signal, "signal");
+ validateFunction(listener, "listener");
+
+ let removeEventListener;
+ if (signal.aborted) {
+ queueMicrotask(() => listener());
+ } else {
+ signal[abortSignal.add](() => {
+ removeEventListener?.();
+ listener();
+ });
+ removeEventListener = () => {
+ signal[abortSignal.remove](listener);
+ };
+ }
+ return {
+ __proto__: null,
+ [SymbolDispose]() {
+ removeEventListener?.();
+ },
+ };
+}
+
+export { addAbortListener };