Skip to content

Commit f805196

Browse files
committed
Adding support for multiple event listeners which also fixes memory leak bug with addEventListener replacing listeners without removing.
1 parent 534ea32 commit f805196

File tree

2 files changed

+29
-8
lines changed

2 files changed

+29
-8
lines changed

index.d.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ declare module 'react-native-callkeep' {
7575
}
7676

7777
type HandleType = 'generic' | 'number' | 'email';
78+
type EventListener = {};
7879

7980
export type AudioRoute = {
8081
name: string,
@@ -134,9 +135,14 @@ declare module 'react-native-callkeep' {
134135
static addEventListener<Event extends Events>(
135136
type: Event,
136137
handler: EventHandlers[Event],
137-
): void
138+
): EventListener
138139

139-
static removeEventListener(type: Events): void
140+
/**
141+
* @description Remove specific event listener if given, otherwise remove all belonging to the given event type.
142+
* @param type
143+
* @param listener
144+
*/
145+
static removeEventListener(type: Events, listener?: EventListener): void
140146

141147
static setup(options: IOptions): Promise<boolean>
142148

index.js

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,17 +27,32 @@ class RNCallKeep {
2727
addEventListener = (type, handler) => {
2828
const listener = listeners[type](handler);
2929

30-
this._callkeepEventHandlers.set(type, listener);
30+
const listenerSet = this._callkeepEventHandlers.get(type) ?? new Set();
31+
listenerSet.add(listener);
32+
33+
this._callkeepEventHandlers.set(type, listenerSet);
34+
35+
return listener;
3136
};
3237

33-
removeEventListener = (type) => {
34-
const listener = this._callkeepEventHandlers.get(type);
35-
if (!listener) {
38+
removeEventListener = (type, listener = undefined) => {
39+
const listenerSet = this._callkeepEventHandlers.get(type);
40+
if (!listenerSet) {
3641
return;
3742
}
3843

39-
listener.remove();
40-
this._callkeepEventHandlers.delete(type);
44+
if (listener) {
45+
listenerSet.delete(listener);
46+
listener.remove();
47+
if (listenerSet.size <= 0) {
48+
this._callkeepEventHandlers.delete(type);
49+
}
50+
} else {
51+
listenerSet.forEach((listener) => {
52+
listener.remove();
53+
});
54+
this._callkeepEventHandlers.delete(type);
55+
}
4156
};
4257

4358
setup = async (options) => {

0 commit comments

Comments
 (0)