@@ -104,10 +104,11 @@ function InternalCloneableDOMException() {
104
104
InternalCloneableDOMException [ kDeserialize ] = ( ) => { } ;
105
105
106
106
class CrossRealmTransformReadableSource {
107
- constructor ( port ) {
107
+ constructor ( port , unref ) {
108
108
this [ kState ] = {
109
109
port,
110
110
controller : undefined ,
111
+ unref,
111
112
} ;
112
113
113
114
port . onmessage = ( { data } ) => {
@@ -145,13 +146,19 @@ class CrossRealmTransformReadableSource {
145
146
error ) ;
146
147
port . close ( ) ;
147
148
} ;
149
+
150
+ port . unref ( ) ;
148
151
}
149
152
150
153
start ( controller ) {
151
154
this [ kState ] . controller = controller ;
152
155
}
153
156
154
157
async pull ( ) {
158
+ if ( this [ kState ] . unref ) {
159
+ this [ kState ] . unref = false ;
160
+ this [ kState ] . port . ref ( ) ;
161
+ }
155
162
this [ kState ] . port . postMessage ( { type : 'pull' } ) ;
156
163
}
157
164
@@ -172,11 +179,12 @@ class CrossRealmTransformReadableSource {
172
179
}
173
180
174
181
class CrossRealmTransformWritableSink {
175
- constructor ( port ) {
182
+ constructor ( port , unref ) {
176
183
this [ kState ] = {
177
184
port,
178
185
controller : undefined ,
179
186
backpressurePromise : createDeferredPromise ( ) ,
187
+ unref,
180
188
} ;
181
189
182
190
port . onmessage = ( { data } ) => {
@@ -213,13 +221,18 @@ class CrossRealmTransformWritableSink {
213
221
port . close ( ) ;
214
222
} ;
215
223
224
+ port . unref ( ) ;
216
225
}
217
226
218
227
start ( controller ) {
219
228
this [ kState ] . controller = controller ;
220
229
}
221
230
222
231
async write ( chunk ) {
232
+ if ( this [ kState ] . unref ) {
233
+ this [ kState ] . unref = false ;
234
+ this [ kState ] . port . ref ( ) ;
235
+ }
223
236
if ( this [ kState ] . backpressurePromise === undefined ) {
224
237
this [ kState ] . backpressurePromise = {
225
238
promise : PromiseResolve ( ) ,
@@ -264,12 +277,12 @@ class CrossRealmTransformWritableSink {
264
277
}
265
278
266
279
function newCrossRealmReadableStream ( writable , port ) {
267
- const readable =
268
- new ReadableStream (
269
- new CrossRealmTransformReadableSource ( port ) ) ;
280
+ // MessagePort should always be unref.
281
+ // There is a problem with the process not terminating.
282
+ // https://github.com/nodejs/node/issues/44985
283
+ const readable = new ReadableStream ( new CrossRealmTransformReadableSource ( port , false ) ) ;
270
284
271
- const promise =
272
- readableStreamPipeTo ( readable , writable , false , false , false ) ;
285
+ const promise = readableStreamPipeTo ( readable , writable , false , false , false ) ;
273
286
274
287
setPromiseHandled ( promise ) ;
275
288
@@ -280,12 +293,15 @@ function newCrossRealmReadableStream(writable, port) {
280
293
}
281
294
282
295
function newCrossRealmWritableSink ( readable , port ) {
283
- const writable =
284
- new WritableStream (
285
- new CrossRealmTransformWritableSink ( port ) ) ;
296
+ // MessagePort should always be unref.
297
+ // There is a problem with the process not terminating.
298
+ // https://github.com/nodejs/node/issues/44985
299
+ const writable = new WritableStream ( new CrossRealmTransformWritableSink ( port , false ) ) ;
286
300
287
301
const promise = readableStreamPipeTo ( readable , writable , false , false , false ) ;
302
+
288
303
setPromiseHandled ( promise ) ;
304
+
289
305
return {
290
306
writable,
291
307
promise,
0 commit comments