@nestjs/core 11.1.25 → 11.1.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nestjs/core",
3
- "version": "11.1.25",
3
+ "version": "11.1.27",
4
4
  "description": "Nest - modern, fast, powerful node.js web framework (@core)",
5
5
  "author": "Kamil Mysliwiec",
6
6
  "license": "MIT",
@@ -28,7 +28,7 @@
28
28
  "uid": "2.0.2"
29
29
  },
30
30
  "devDependencies": {
31
- "@nestjs/common": "11.1.25"
31
+ "@nestjs/common": "11.1.27"
32
32
  },
33
33
  "peerDependencies": {
34
34
  "@nestjs/common": "^11.0.0",
@@ -49,5 +49,5 @@
49
49
  "optional": true
50
50
  }
51
51
  },
52
- "gitHead": "02f804159841a2771755c382832a7938b904c420"
52
+ "gitHead": "660a1249e32e7701cdd7e5ccb20b7f695e721bce"
53
53
  }
@@ -59,28 +59,49 @@ class RouterResponseController {
59
59
  200;
60
60
  return new Promise((resolve, reject) => {
61
61
  let settled = false;
62
+ let closeRequested = false;
62
63
  let subscription;
63
- const cleanup = () => request.removeListener('close', onClose);
64
+ const disconnectSource = request.socket ?? response;
65
+ const cleanup = () => disconnectSource.removeListener('close', onClose);
66
+ const endStream = () => {
67
+ if (!stream.writableEnded) {
68
+ stream.end();
69
+ }
70
+ };
64
71
  const onClose = () => {
65
- if (settled) {
72
+ if (settled || closeRequested) {
73
+ return;
74
+ }
75
+ closeRequested = true;
76
+ if (!subscription) {
77
+ cleanup();
66
78
  return;
67
79
  }
68
80
  settled = true;
69
81
  cleanup();
70
82
  subscription?.unsubscribe();
71
- if (!stream.writableEnded) {
72
- stream.end();
73
- }
83
+ endStream();
74
84
  response.end();
75
85
  resolve();
76
86
  };
77
- request.once('close', onClose);
87
+ disconnectSource.once('close', onClose);
78
88
  Promise.resolve(result)
79
89
  .then(observableResult => {
80
90
  if (settled) {
81
91
  return;
82
92
  }
83
93
  this.assertObservable(observableResult);
94
+ if (closeRequested) {
95
+ const cleanupSubscription = observableResult.subscribe({
96
+ error: () => undefined,
97
+ });
98
+ cleanupSubscription.unsubscribe();
99
+ settled = true;
100
+ endStream();
101
+ response.end();
102
+ resolve();
103
+ return;
104
+ }
84
105
  stream.pipe(response, {
85
106
  additionalHeaders: options?.additionalHeaders,
86
107
  statusCode,
@@ -110,9 +131,7 @@ class RouterResponseController {
110
131
  }
111
132
  settled = true;
112
133
  cleanup();
113
- if (!stream.writableEnded) {
114
- stream.end();
115
- }
134
+ endStream();
116
135
  reject(err);
117
136
  },
118
137
  complete: () => {
@@ -121,9 +140,7 @@ class RouterResponseController {
121
140
  }
122
141
  settled = true;
123
142
  cleanup();
124
- if (!stream.writableEnded) {
125
- stream.end();
126
- }
143
+ endStream();
127
144
  resolve();
128
145
  },
129
146
  });
@@ -142,11 +159,16 @@ class RouterResponseController {
142
159
  if (settled) {
143
160
  return;
144
161
  }
162
+ if (closeRequested) {
163
+ settled = true;
164
+ endStream();
165
+ response.end();
166
+ resolve();
167
+ return;
168
+ }
145
169
  settled = true;
146
170
  cleanup();
147
- if (!stream.writableEnded) {
148
- stream.end();
149
- }
171
+ endStream();
150
172
  reject(err);
151
173
  });
152
174
  });