Skip to content

Commit

Permalink
update utils
Browse files Browse the repository at this point in the history
  • Loading branch information
Alex Luu committed Feb 20, 2024
1 parent ec65468 commit 6b95286
Show file tree
Hide file tree
Showing 2 changed files with 4 additions and 91 deletions.
1 change: 1 addition & 0 deletions packages/web3-utils/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@
},
"dependencies": {
"ethereum-cryptography": "^2.0.0",
"eventemitter3": "^5.0.1",
"web3-errors": "^1.1.4",
"web3-types": "^1.4.0",
"web3-validator": "^2.0.4"
Expand Down
94 changes: 3 additions & 91 deletions packages/web3-utils/src/event_emitter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,75 +16,16 @@ along with web3.js. If not, see <http://www.gnu.org/licenses/>.
*/
/* eslint-disable max-classes-per-file */

import { EventEmitter as EventEmitterAtNode } from 'events';
import EventEmitter3 from 'eventemitter3';

// eslint-disable-next-line @typescript-eslint/no-explicit-any
type Callback = (params: any) => void | Promise<void>;

type EventTargetCallback = (params: CustomEvent) => void;

const wrapFunction =
(fn: Callback): EventTargetCallback =>
(params: CustomEvent) =>
fn(params.detail);

/**
* This class copy the behavior of Node.js EventEmitter class.
* It is used to provide the same interface for the browser environment.
*/
class EventEmitterAtBrowser extends EventTarget {
private _listeners: Record<string, [key: Callback, value: EventTargetCallback][]> = {};
export class EventEmitter extends EventEmitter3 {
private maxListeners = Number.MAX_SAFE_INTEGER;

public on(eventName: string, fn: Callback) {
this.addEventListener(eventName, fn);
return this;
}

public once(eventName: string, fn: Callback) {
const onceCallback = async (params: Callback) => {
this.off(eventName, onceCallback);
await fn(params);
};
return this.on(eventName, onceCallback);
}

public off(eventName: string, fn: Callback) {
this.removeEventListener(eventName, fn);
return this;
}

public emit(eventName: string, params: unknown) {
const event = new CustomEvent(eventName, { detail: params });
return super.dispatchEvent(event);
}

public listenerCount(eventName: string): number {
const eventListeners = this._listeners[eventName];
return eventListeners ? eventListeners.length : 0;
}

public listeners(eventName: string): Callback[] {
return this._listeners[eventName].map(value => value[0]) || [];
}

public eventNames(): string[] {
return Object.keys(this._listeners);
}

public removeAllListeners() {
Object.keys(this._listeners).forEach(event => {
this._listeners[event].forEach(
(listener: [key: Callback, value: EventTargetCallback]) => {
super.removeEventListener(event, listener[1] as EventListener);
},
);
});

this._listeners = {};
return this;
}

public setMaxListeners(maxListeners: number) {
this.maxListeners = maxListeners;
return this;
Expand All @@ -94,35 +35,6 @@ class EventEmitterAtBrowser extends EventTarget {
return this.maxListeners;
}

public addEventListener(eventName: string, fn: Callback) {
const wrappedFn = wrapFunction(fn);
super.addEventListener(eventName, wrappedFn as EventListener);
if (!this._listeners[eventName]) {
this._listeners[eventName] = [];
}
this._listeners[eventName].push([fn, wrappedFn]);
}

public removeEventListener(eventName: string, fn: Callback) {
const eventListeners = this._listeners[eventName];
if (eventListeners) {
const index = eventListeners.findIndex(item => item[0] === fn);
if (index !== -1) {
super.removeEventListener(eventName, eventListeners[index][1] as EventListener);
eventListeners.splice(index, 1);
}
}
}
}

// eslint-disable-next-line import/no-mutable-exports
let EventEmitterType: typeof EventEmitterAtNode;
// Check if the code is running in a Node.js environment
if (typeof window === 'undefined') {
EventEmitterType = EventEmitterAtNode;
} else {
// Fallback for the browser environment
EventEmitterType = EventEmitterAtBrowser as unknown as typeof EventEmitterAtNode;
}

export class EventEmitter extends EventEmitterType {}
// let EventEmitterType: typeof EventEmitter3;

1 comment on commit 6b95286

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark

Benchmark suite Current: 6b95286 Previous: 6c075db Ratio
processingTx 9767 ops/sec (±3.71%) 9301 ops/sec (±4.81%) 0.95
processingContractDeploy 41161 ops/sec (±7.00%) 39129 ops/sec (±7.62%) 0.95
processingContractMethodSend 20253 ops/sec (±7.73%) 19443 ops/sec (±5.19%) 0.96
processingContractMethodCall 39112 ops/sec (±6.02%) 38971 ops/sec (±6.34%) 1.00
abiEncode 44685 ops/sec (±7.66%) 44252 ops/sec (±6.92%) 0.99
abiDecode 28962 ops/sec (±8.92%) 30419 ops/sec (±8.89%) 1.05
sign 1660 ops/sec (±4.02%) 1656 ops/sec (±4.08%) 1.00
verify 373 ops/sec (±0.62%) 373 ops/sec (±0.78%) 1

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.