Node updated. Some todos.

This commit is contained in:
Norm Rasmussen
2024-09-23 20:52:09 -04:00
parent 8bfaca8375
commit f25622067f
2041 changed files with 124145 additions and 110445 deletions

View File

@ -3,14 +3,17 @@ const errors = require('./lib/errors')
class EventListener {
constructor () {
this.list = []
this.count = 0
}
append (ctx, name, fn, once) {
this.count++
ctx.emit('newListener', name, fn) // Emit BEFORE adding
this.list.push([fn, once])
}
prepend (ctx, name, fn, once) {
this.count++
ctx.emit('newListener', name, fn) // Emit BEFORE adding
this.list.unshift([fn, once])
}
@ -22,9 +25,11 @@ class EventListener {
if (l[0] === fn) {
this.list.splice(i, 1)
if (this.list.length === 0) delete ctx._events[name]
if (this.count === 1) delete ctx._events[name]
ctx.emit('removeListener', name, fn) // Emit AFTER removing
this.count--
return
}
}
@ -34,11 +39,13 @@ class EventListener {
const list = [...this.list]
this.list = []
if (this.count === list.length) delete ctx._events[name]
for (let i = list.length - 1; i >= 0; i--) {
ctx.emit('removeListener', name, list[i][0]) // Emit AFTER removing
}
if (this.list.length === 0) delete ctx._events[name]
this.count -= list.length
}
emit (ctx, name, ...args) {
@ -74,6 +81,20 @@ function removeListener (ctx, name, fn) {
return ctx
}
function throwUnhandledError (...args) {
let err
if (args.length > 0) err = args[0]
if (err instanceof Error === false) err = errors.UNHANDLED_ERROR(err)
if (Error.captureStackTrace) {
Error.captureStackTrace(err, exports.prototype.emit)
}
queueMicrotask(() => { throw err })
}
module.exports = exports = class EventEmitter {
constructor () {
this._events = Object.create(null)
@ -112,6 +133,7 @@ module.exports = exports = class EventEmitter {
}
emit (name, ...args) {
if (name === 'error' && this._events.error === undefined) throwUnhandledError(...args)
const e = this._events[name]
return e === undefined ? false : e.emit(this, name, ...args)
}
@ -149,6 +171,8 @@ module.exports = exports = class EventEmitter {
exports.EventEmitter = exports
exports.errors = errors
exports.defaultMaxListeners = 10
exports.on = function on (emitter, name, opts = {}) {
@ -253,16 +277,56 @@ exports.once = function once (emitter, name, opts = {}) {
}
return new Promise((resolve, reject) => {
if (name !== 'error') emitter.on('error', onerror)
if (signal) signal.addEventListener('abort', onabort)
emitter.once(name, (...args) => {
if (name !== 'error') emitter.off('error', onerror)
if (signal) signal.removeEventListener('abort', onabort)
resolve(args)
})
function onerror (err) {
emitter.off('error', onerror)
reject(err)
}
function onabort () {
reject(errors.OPERATION_ABORTED(signal.reason))
signal.removeEventListener('abort', onabort)
onerror(errors.OPERATION_ABORTED(signal.reason))
}
})
}
exports.forward = function forward (from, to, names, opts = {}) {
if (typeof names === 'string') names = [names]
const {
emit = to.emit.bind(to)
} = opts
const listeners = names.map((name) => function onevent (...args) {
emit(name, ...args)
})
to
.on('newListener', (name) => {
const i = names.indexOf(name)
if (i !== -1 && to.listenerCount(name) === 0) {
from.on(name, listeners[i])
}
})
.on('removeListener', (name) => {
const i = names.indexOf(name)
if (i !== -1 && to.listenerCount(name) === 0) {
from.off(name, listeners[i])
}
})
}

View File

@ -15,4 +15,8 @@ module.exports = class EventEmitterError extends Error {
static OPERATION_ABORTED (cause, msg = 'Operation aborted') {
return new EventEmitterError(msg, 'OPERATION_ABORTED', EventEmitterError.OPERATION_ABORTED, { cause })
}
static UNHANDLED_ERROR (cause, msg = 'Unhandled error') {
return new EventEmitterError(msg, 'UNHANDLED_ERROR', EventEmitterError.UNHANDLED_ERROR, { cause })
}
}

View File

@ -1,14 +1,21 @@
{
"name": "bare-events",
"version": "2.2.0",
"version": "2.4.2",
"description": "Event emitters for JavaScript",
"main": "index.js",
"exports": {
".": "./index.js",
"./package": "./package.json",
"./errors": "./lib/errors.js"
},
"files": [
"index.js",
"lib"
],
"scripts": {
"test": "standard && bare test.js"
"test": "npm run lint && npm run test:bare && npm run test:node",
"test:bare": "bare test.js",
"test:node": "node test.js",
"lint": "standard"
},
"repository": {
"type": "git",