Skip to content

Commit f797e16

Browse files
committed
fix(core): possible memory leak when using server side events
1 parent af87b2a commit f797e16

File tree

3 files changed

+7
-6
lines changed

3 files changed

+7
-6
lines changed

packages/core/router/router-response-controller.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
import { isObject } from '@nestjs/common/utils/shared.utils';
99
import { IncomingMessage } from 'http';
1010
import { EMPTY, lastValueFrom, Observable, isObservable } from 'rxjs';
11-
import { catchError, debounce, map } from 'rxjs/operators';
11+
import { catchError, concatMap, map } from 'rxjs/operators';
1212
import {
1313
AdditionalHeaders,
1414
WritableHeaderStream,
@@ -128,7 +128,7 @@ export class RouterResponseController {
128128

129129
return { data: message as object | string };
130130
}),
131-
debounce(
131+
concatMap(
132132
message =>
133133
new Promise<void>(resolve =>
134134
stream.writeMessage(message, () => resolve()),
@@ -153,6 +153,9 @@ export class RouterResponseController {
153153

154154
request.on('close', () => {
155155
subscription.unsubscribe();
156+
if (!stream.writableEnded) {
157+
stream.end();
158+
}
156159
});
157160
}
158161

packages/core/router/sse-stream.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ export class SseStream extends Transform {
116116
message.id = this.lastEventId.toString();
117117
}
118118

119-
if (!this.write(message, 'utf-8', cb)) {
119+
if (!this.write(message, 'utf-8')) {
120120
this.once('drain', cb);
121121
} else {
122122
process.nextTick(cb);

packages/core/test/router/router-response-controller.spec.ts

+1-3
Original file line numberDiff line numberDiff line change
@@ -436,9 +436,7 @@ data: test
436436

437437
await new Promise(resolve => process.nextTick(resolve));
438438

439-
expect(() => {
440-
expect(maxDrainListenersExceededWarning).to.equal(null);
441-
}, 'it will fail as there is an issue here to be addressed').to.throw();
439+
expect(maxDrainListenersExceededWarning).to.equal(null);
442440
});
443441
});
444442

0 commit comments

Comments
 (0)