diff options
author | Luca Casonato <hello@lcas.dev> | 2024-09-05 09:22:52 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-05 09:22:52 +0200 |
commit | 49e3ee010c7d4423fbab89bf12749235e156c9be (patch) | |
tree | 92185d6cf32a94ae4b241a23a64309bec3f92e59 /ext/node/polyfills/internal | |
parent | 17b5e98b822dc23407a0292dcf61e624fbf2a4b1 (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.mjs | 44 |
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 }; |