Skip to content

Commit

Permalink
Add polyfill for addAbortListener
Browse files Browse the repository at this point in the history
Signed-off-by: Matteo Collina <hello@matteocollina.com>
  • Loading branch information
mcollina committed Dec 15, 2023
1 parent d5b816d commit cf4c054
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 2 deletions.
8 changes: 8 additions & 0 deletions build/replacements.mjs
Expand Up @@ -275,6 +275,11 @@ const duplexFromTestWebStreamNeutralizeWritable = [
'makeATestWritableStreamOff(writeFunc) {'
]

const polyfillAddAbortSignal = [
'require\\(\'events\'\\).addAbortListener',
'require(\'../../ours/util\').addAbortListener'
]

export const replacements = {
'lib/_stream.+': [legacyStreamsRequireStream],
'lib/internal/streams/duplexify.+': [
Expand All @@ -289,6 +294,9 @@ export const replacements = {
internalStreamsNoRequireAbortController2,
internalStreamsWeakHandler2
],
'lib/internal/streams/add-abort-signal.js': [
polyfillAddAbortSignal
],
'lib/internal/streams/readable.js': [
removefromWebReadableMethod,
removetoWebReadableMethod
Expand Down
2 changes: 1 addition & 1 deletion lib/internal/streams/add-abort-signal.js
Expand Up @@ -44,7 +44,7 @@ module.exports.addAbortSignalNoValidate = function (signal, stream) {
if (signal.aborted) {
onAbort()
} else {
addAbortListener ??= require('events').addAbortListener
addAbortListener ??= require('../../ours/util').addAbortListener
const disposable = addAbortListener(signal, onAbort)
eos(stream, disposable[SymbolDispose])
}
Expand Down
35 changes: 34 additions & 1 deletion lib/ours/util.js
@@ -1,6 +1,7 @@
'use strict'

const bufferModule = require('buffer')
const { kResistStopPropagation, SymbolDispose } = require('./primordials')
const AsyncFunction = Object.getPrototypeOf(async function () {}).constructor
const Blob = globalThis.Blob || bufferModule.Blob
/* eslint-disable indent */
Expand Down Expand Up @@ -126,6 +127,38 @@ module.exports = {
isBlob,
deprecate(fn, message) {
return fn
}
},
addAbortListener:
require('events').addAbortListener ||
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.addEventListener('abort', listener, {
__proto__: null,
once: true,
[kResistStopPropagation]: true
})
removeEventListener = () => {
signal.removeEventListener('abort', listener)
}
}
return {
__proto__: null,
[SymbolDispose]() {
var _removeEventListener
;(_removeEventListener = removeEventListener) === null || _removeEventListener === undefined
? undefined
: _removeEventListener()
}
}
}
}
module.exports.promisify.custom = Symbol.for('nodejs.util.promisify.custom')
24 changes: 24 additions & 0 deletions src/util.js
@@ -1,6 +1,7 @@
'use strict'

const bufferModule = require('buffer')
const { kResistStopPropagation, SymbolDispose } = require('./primordials')

const AsyncFunction = Object.getPrototypeOf(async function () {}).constructor
const Blob = globalThis.Blob || bufferModule.Blob
Expand Down Expand Up @@ -136,6 +137,29 @@ module.exports = {
isBlob,
deprecate(fn, message) {
return fn
},
addAbortListener: require('events').addAbortListener || 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.addEventListener('abort', listener, { __proto__: null, once: true, [kResistStopPropagation]: true });
removeEventListener = () => {
signal.removeEventListener('abort', listener);
};
}
return {
__proto__: null,
[SymbolDispose]() {
removeEventListener?.();
},
};
}
}

Expand Down

0 comments on commit cf4c054

Please sign in to comment.