Skip to content

Commit a90b88f

Browse files
szymonlesiszmroz22
authored andcommitted
fix(transport): remove listeners of AbortSignal to prevent memory leaks
1 parent 62c2c5c commit a90b88f

File tree

2 files changed

+21
-15
lines changed

2 files changed

+21
-15
lines changed

packages/transport-bridge/src/http.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,11 @@ export class TrezordNode {
9696

9797
private createAbortSignal(res: any) {
9898
const abortController = new AbortController();
99-
res.addListener('close', () => {
99+
const listener = () => {
100100
abortController.abort();
101-
});
101+
res.removeListener('close', listener);
102+
};
103+
res.addListener('close', listener);
102104

103105
return abortController.signal;
104106
}

packages/transport/src/api/udp.ts

+17-13
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,18 @@ export class UdpApi extends AbstractApi {
4242
const [hostname, port] = path.split(':');
4343

4444
return new Promise<AbstractApiAwaitedResult<'write'>>(resolve => {
45-
signal?.addEventListener('abort', () => {
45+
const listener = () => {
4646
resolve(
4747
this.error({
4848
error: ERRORS.ABORTED_BY_SIGNAL,
4949
}),
5050
);
51-
});
51+
};
52+
signal?.addEventListener('abort', listener);
5253

5354
this.interface.send(buffer, Number.parseInt(port, 10), hostname, err => {
55+
signal?.removeEventListener('abort', listener);
56+
5457
if (signal?.aborted) {
5558
return;
5659
}
@@ -75,13 +78,13 @@ export class UdpApi extends AbstractApi {
7578
this.communicating = true;
7679

7780
return new Promise<AbstractApiAwaitedResult<'read'>>(resolve => {
81+
/* eslint-disable @typescript-eslint/no-use-before-define */
7882
const onClear = () => {
79-
// eslint-disable-next-line @typescript-eslint/no-use-before-define
8083
this.interface.removeListener('error', onError);
81-
// eslint-disable-next-line @typescript-eslint/no-use-before-define
8284
this.interface.removeListener('message', onMessage);
85+
signal?.removeEventListener('abort', onAbort);
8386
};
84-
87+
/* eslint-enable @typescript-eslint/no-use-before-define */
8588
const onError = (err: Error) => {
8689
this.logger?.error(err.message);
8790

@@ -126,21 +129,22 @@ export class UdpApi extends AbstractApi {
126129
}
127130

128131
const pinged = new Promise<boolean>(resolve => {
129-
const onError = () => {
130-
resolve(false);
132+
/* eslint-disable @typescript-eslint/no-use-before-define */
133+
const onClear = () => {
131134
this.interface.removeListener('error', onError);
132-
// eslint-disable-next-line @typescript-eslint/no-use-before-define
133135
this.interface.removeListener('message', onMessage);
134-
// eslint-disable-next-line @typescript-eslint/no-use-before-define
135136
clearTimeout(timeout);
137+
signal?.removeEventListener('abort', onError);
138+
};
139+
/* eslint-enable @typescript-eslint/no-use-before-define */
140+
const onError = () => {
141+
resolve(false);
142+
onClear();
136143
};
137144
const onMessage = (message: Buffer, _info: UDP.RemoteInfo) => {
138145
if (message.toString() === 'PONGPONG') {
139146
resolve(true);
140-
this.interface.removeListener('error', onError);
141-
this.interface.removeListener('message', onMessage);
142-
// eslint-disable-next-line @typescript-eslint/no-use-before-define
143-
clearTimeout(timeout);
147+
onClear();
144148
}
145149
};
146150

0 commit comments

Comments
 (0)