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