mirror of
https://github.com/github/codeql-action.git
synced 2025-12-30 11:10:22 +08:00
171 lines
5.0 KiB
JavaScript
171 lines
5.0 KiB
JavaScript
// src/MemoryLeakError.ts
|
|
var MemoryLeakError = class extends Error {
|
|
constructor(emitter, type, count) {
|
|
super(
|
|
`Possible EventEmitter memory leak detected. ${count} ${type.toString()} listeners added. Use emitter.setMaxListeners() to increase limit`
|
|
);
|
|
this.emitter = emitter;
|
|
this.type = type;
|
|
this.count = count;
|
|
this.name = "MaxListenersExceededWarning";
|
|
}
|
|
};
|
|
|
|
// src/Emitter.ts
|
|
var _Emitter = class {
|
|
static listenerCount(emitter, eventName) {
|
|
return emitter.listenerCount(eventName);
|
|
}
|
|
constructor() {
|
|
this.events = /* @__PURE__ */ new Map();
|
|
this.maxListeners = _Emitter.defaultMaxListeners;
|
|
this.hasWarnedAboutPotentialMemoryLeak = false;
|
|
}
|
|
_emitInternalEvent(internalEventName, eventName, listener) {
|
|
this.emit(
|
|
internalEventName,
|
|
...[eventName, listener]
|
|
);
|
|
}
|
|
_getListeners(eventName) {
|
|
return Array.prototype.concat.apply([], this.events.get(eventName)) || [];
|
|
}
|
|
_removeListener(listeners, listener) {
|
|
const index = listeners.indexOf(listener);
|
|
if (index > -1) {
|
|
listeners.splice(index, 1);
|
|
}
|
|
return [];
|
|
}
|
|
_wrapOnceListener(eventName, listener) {
|
|
const onceListener = (...data) => {
|
|
this.removeListener(eventName, onceListener);
|
|
return listener.apply(this, data);
|
|
};
|
|
Object.defineProperty(onceListener, "name", { value: listener.name });
|
|
return onceListener;
|
|
}
|
|
setMaxListeners(maxListeners) {
|
|
this.maxListeners = maxListeners;
|
|
return this;
|
|
}
|
|
/**
|
|
* Returns the current max listener value for the `Emitter` which is
|
|
* either set by `emitter.setMaxListeners(n)` or defaults to
|
|
* `Emitter.defaultMaxListeners`.
|
|
*/
|
|
getMaxListeners() {
|
|
return this.maxListeners;
|
|
}
|
|
/**
|
|
* Returns an array listing the events for which the emitter has registered listeners.
|
|
* The values in the array will be strings or Symbols.
|
|
*/
|
|
eventNames() {
|
|
return Array.from(this.events.keys());
|
|
}
|
|
/**
|
|
* Synchronously calls each of the listeners registered for the event named `eventName`,
|
|
* in the order they were registered, passing the supplied arguments to each.
|
|
* Returns `true` if the event has listeners, `false` otherwise.
|
|
*
|
|
* @example
|
|
* const emitter = new Emitter<{ hello: [string] }>()
|
|
* emitter.emit('hello', 'John')
|
|
*/
|
|
emit(eventName, ...data) {
|
|
const listeners = this._getListeners(eventName);
|
|
listeners.forEach((listener) => {
|
|
listener.apply(this, data);
|
|
});
|
|
return listeners.length > 0;
|
|
}
|
|
addListener(eventName, listener) {
|
|
this._emitInternalEvent("newListener", eventName, listener);
|
|
const nextListeners = this._getListeners(eventName).concat(listener);
|
|
this.events.set(eventName, nextListeners);
|
|
if (this.maxListeners > 0 && this.listenerCount(eventName) > this.maxListeners && !this.hasWarnedAboutPotentialMemoryLeak) {
|
|
this.hasWarnedAboutPotentialMemoryLeak = true;
|
|
const memoryLeakWarning = new MemoryLeakError(
|
|
this,
|
|
eventName,
|
|
this.listenerCount(eventName)
|
|
);
|
|
console.warn(memoryLeakWarning);
|
|
}
|
|
return this;
|
|
}
|
|
on(eventName, listener) {
|
|
return this.addListener(eventName, listener);
|
|
}
|
|
once(eventName, listener) {
|
|
return this.addListener(
|
|
eventName,
|
|
this._wrapOnceListener(eventName, listener)
|
|
);
|
|
}
|
|
prependListener(eventName, listener) {
|
|
const listeners = this._getListeners(eventName);
|
|
if (listeners.length > 0) {
|
|
const nextListeners = [listener].concat(listeners);
|
|
this.events.set(eventName, nextListeners);
|
|
} else {
|
|
this.events.set(eventName, listeners.concat(listener));
|
|
}
|
|
return this;
|
|
}
|
|
prependOnceListener(eventName, listener) {
|
|
return this.prependListener(
|
|
eventName,
|
|
this._wrapOnceListener(eventName, listener)
|
|
);
|
|
}
|
|
removeListener(eventName, listener) {
|
|
const listeners = this._getListeners(eventName);
|
|
if (listeners.length > 0) {
|
|
this._removeListener(listeners, listener);
|
|
this.events.set(eventName, listeners);
|
|
this._emitInternalEvent("removeListener", eventName, listener);
|
|
}
|
|
return this;
|
|
}
|
|
/**
|
|
* Alias for `emitter.removeListener()`.
|
|
*
|
|
* @example
|
|
* emitter.off('hello', listener)
|
|
*/
|
|
off(eventName, listener) {
|
|
return this.removeListener(eventName, listener);
|
|
}
|
|
removeAllListeners(eventName) {
|
|
if (eventName) {
|
|
this.events.delete(eventName);
|
|
} else {
|
|
this.events.clear();
|
|
}
|
|
return this;
|
|
}
|
|
/**
|
|
* Returns a copy of the array of listeners for the event named `eventName`.
|
|
*/
|
|
listeners(eventName) {
|
|
return Array.from(this._getListeners(eventName));
|
|
}
|
|
/**
|
|
* Returns the number of listeners listening to the event named `eventName`.
|
|
*/
|
|
listenerCount(eventName) {
|
|
return this._getListeners(eventName).length;
|
|
}
|
|
rawListeners(eventName) {
|
|
return this.listeners(eventName);
|
|
}
|
|
};
|
|
var Emitter = _Emitter;
|
|
Emitter.defaultMaxListeners = 10;
|
|
export {
|
|
Emitter,
|
|
MemoryLeakError
|
|
};
|
|
//# sourceMappingURL=index.mjs.map
|