basant307/AI_Governance_Project
048
1const errors = require('./lib/errors')2 3class EventListener {4 constructor() {5 this.list = []6 this.count = 07 }8 9 append(ctx, name, fn, once) {10 this.count++11 ctx.emit('newListener', name, fn) // Emit BEFORE adding12 this.list.push([fn, once])13 }14 15 prepend(ctx, name, fn, once) {16 this.count++17 ctx.emit('newListener', name, fn) // Emit BEFORE adding18 this.list.unshift([fn, once])19 }20 21 remove(ctx, name, fn) {22 for (let i = 0, n = this.list.length; i < n; i++) {23 const l = this.list[i]24 25 if (l[0] === fn) {26 this.list.splice(i, 1)27 28 if (this.count === 1) delete ctx._events[name]29 30 ctx.emit('removeListener', name, fn) // Emit AFTER removing31 32 this.count--33 return34 }35 }36 }37 38 removeAll(ctx, name) {39 const list = [...this.list]40 this.list = []41 42 if (this.count === list.length) delete ctx._events[name]43 44 for (let i = list.length - 1; i >= 0; i--) {45 ctx.emit('removeListener', name, list[i][0]) // Emit AFTER removing46 }47 48 this.count -= list.length49 }50 51 emit(ctx, name, ...args) {52 const list = [...this.list]53 54 for (let i = 0, n = list.length; i < n; i++) {55 const l = list[i]56 57 if (l[1] === true) this.remove(ctx, name, l[0])58 59 Reflect.apply(l[0], ctx, args)60 }61 62 return list.length > 063 }64}65 66function appendListener(ctx, name, fn, once) {67 const e = ctx._events[name] || (ctx._events[name] = new EventListener())68 e.append(ctx, name, fn, once)69 return ctx70}71 72function prependListener(ctx, name, fn, once) {73 const e = ctx._events[name] || (ctx._events[name] = new EventListener())74 e.prepend(ctx, name, fn, once)75 return ctx76}77 78function removeListener(ctx, name, fn) {79 const e = ctx._events[name]80 if (e !== undefined) e.remove(ctx, name, fn)81 return ctx82}83 84function throwUnhandledError(...args) {85 let err86 87 if (args.length > 0) err = args[0]88 89 if (err instanceof Error === false) err = errors.UNHANDLED_ERROR(err)90 91 if (Error.captureStackTrace) {92 Error.captureStackTrace(err, exports.prototype.emit)93 }94 95 queueMicrotask(() => {96 throw err97 })98}99 100module.exports = exports = class EventEmitter {101 constructor() {102 this._events = Object.create(null)103 }104 105 addListener(name, fn) {106 return appendListener(this, name, fn, false)107 }108 109 addOnceListener(name, fn) {110 return appendListener(this, name, fn, true)111 }112 113 prependListener(name, fn) {114 return prependListener(this, name, fn, false)115 }116 117 prependOnceListener(name, fn) {118 return prependListener(this, name, fn, true)119 }120 121 removeListener(name, fn) {122 return removeListener(this, name, fn)123 }124 125 on(name, fn) {126 return appendListener(this, name, fn, false)127 }128 129 once(name, fn) {130 return appendListener(this, name, fn, true)131 }132 133 off(name, fn) {134 return removeListener(this, name, fn)135 }136 137 emit(name, ...args) {138 if (name === 'error' && this._events.error === undefined) {139 throwUnhandledError(...args)140 }141 142 const e = this._events[name]143 return e === undefined ? false : e.emit(this, name, ...args)144 }145 146 listeners(name) {147 const e = this._events[name]148 return e === undefined ? [] : [...e.list]149 }150 151 listenerCount(name) {152 const e = this._events[name]153 return e === undefined ? 0 : e.list.length154 }155 156 getMaxListeners() {157 return EventEmitter.defaultMaxListeners158 }159 160 setMaxListeners(n) {}161 162 removeAllListeners(name) {163 if (arguments.length === 0) {164 for (const key of Reflect.ownKeys(this._events)) {165 if (key === 'removeListener') continue166 this.removeAllListeners(key)167 }168 this.removeAllListeners('removeListener')169 } else {170 const e = this._events[name]171 if (e !== undefined) e.removeAll(this, name)172 }173 return this174 }175}176 177exports.EventEmitter = exports178 179exports.errors = errors180 181exports.defaultMaxListeners = 10182 183exports.on = function on(emitter, name, opts = {}) {184 const { signal } = opts185 186 if (signal && signal.aborted) {187 throw errors.OPERATION_ABORTED(signal.reason)188 }189 190 let error = null191 let done = false192 193 const events = []194 const promises = []195 196 emitter.on(name, onevent)197 198 if (name !== 'error') emitter.on('error', onerror)199 200 if (signal) signal.addEventListener('abort', onabort)201 202 return {203 next() {204 if (events.length) {205 return Promise.resolve({ value: events.shift(), done: false })206 }207 208 if (error) {209 const err = error210 211 error = null212 213 return Promise.reject(err)214 }215 216 if (done) return onclose()217 218 return new Promise((resolve, reject) =>219 promises.push({ resolve, reject })220 )221 },222 223 return() {224 return onclose()225 },226 227 throw(err) {228 return onerror(err)229 },230 231 [Symbol.asyncIterator]() {232 return this233 }234 }235 236 function onevent(...args) {237 if (promises.length) {238 promises.shift().resolve({ value: args, done: false })239 } else {240 events.push(args)241 }242 }243 244 function onerror(err) {245 if (promises.length) {246 promises.shift().reject(err)247 } else {248 error = err249 }250 251 return Promise.resolve({ done: true })252 }253 254 function onabort() {255 onerror(errors.OPERATION_ABORTED(signal.reason))256 }257 258 function onclose() {259 emitter.off(name, onevent)260 261 if (name !== 'error') emitter.off('error', onerror)262 263 if (signal) signal.removeEventListener('abort', onabort)264 265 done = true266 267 if (promises.length) promises.shift().resolve({ done: true })268 269 return Promise.resolve({ done: true })270 }271}272 273exports.once = function once(emitter, name, opts = {}) {274 const { signal } = opts275 276 if (signal && signal.aborted) {277 throw errors.OPERATION_ABORTED(signal.reason)278 }279 280 return new Promise((resolve, reject) => {281 if (name !== 'error') emitter.on('error', onerror)282 283 if (signal) signal.addEventListener('abort', onabort)284 285 emitter.once(name, (...args) => {286 if (name !== 'error') emitter.off('error', onerror)287 288 if (signal) signal.removeEventListener('abort', onabort)289 290 resolve(args)291 })292 293 function onerror(err) {294 emitter.off('error', onerror)295 296 reject(err)297 }298 299 function onabort() {300 signal.removeEventListener('abort', onabort)301 302 onerror(errors.OPERATION_ABORTED(signal.reason))303 }304 })305}306 307exports.forward = function forward(from, to, names, opts = {}) {308 if (typeof names === 'string') names = [names]309 310 const { emit = to.emit.bind(to) } = opts311 312 const listeners = names.map(313 (name) =>314 function onevent(...args) {315 emit(name, ...args)316 }317 )318 319 to.on('newListener', (name) => {320 const i = names.indexOf(name)321 322 if (i !== -1 && to.listenerCount(name) === 0) {323 from.on(name, listeners[i])324 }325 }).on('removeListener', (name) => {326 const i = names.indexOf(name)327 328 if (i !== -1 && to.listenerCount(name) === 0) {329 from.off(name, listeners[i])330 }331 })332}333 334exports.listenerCount = function listenerCount(emitter, name) {335 return emitter.listenerCount(name)336}337 338exports.getMaxListeners = function getMaxListeners(emitter) {339 if (typeof emitter.getMaxListeners === 'function') {340 return emitter.getMaxListeners()341 }342 343 return exports.defaultMaxListeners344}345 346exports.setMaxListeners = function setMaxListeners(n, ...emitters) {347 if (emitters.length === 0) exports.defaultMaxListeners = n348 else {349 for (const emitter of emitters) {350 if (typeof emitter.setMaxListeners === 'function') {351 emitter.setMaxListeners(n)352 }353 }354 }355}356 