@@ -102,10 +102,11 @@ function InternalCloneableDOMException() {
102102InternalCloneableDOMException [ kDeserialize ] = ( ) => { } ;
103103
104104class CrossRealmTransformReadableSource {
105- constructor ( port ) {
105+ constructor ( port , unref ) {
106106 this [ kState ] = {
107107 port,
108108 controller : undefined ,
109+ unref,
109110 } ;
110111
111112 port . onmessage = ( { data } ) => {
@@ -143,13 +144,19 @@ class CrossRealmTransformReadableSource {
143144 error ) ;
144145 port . close ( ) ;
145146 } ;
147+
148+ port . unref ( ) ;
146149 }
147150
148151 start ( controller ) {
149152 this [ kState ] . controller = controller ;
150153 }
151154
152155 async pull ( ) {
156+ if ( this [ kState ] . unref ) {
157+ this [ kState ] . unref = false ;
158+ this [ kState ] . port . ref ( ) ;
159+ }
153160 this [ kState ] . port . postMessage ( { type : 'pull' } ) ;
154161 }
155162
@@ -170,11 +177,12 @@ class CrossRealmTransformReadableSource {
170177}
171178
172179class CrossRealmTransformWritableSink {
173- constructor ( port ) {
180+ constructor ( port , unref ) {
174181 this [ kState ] = {
175182 port,
176183 controller : undefined ,
177184 backpressurePromise : createDeferredPromise ( ) ,
185+ unref,
178186 } ;
179187
180188 port . onmessage = ( { data } ) => {
@@ -211,13 +219,18 @@ class CrossRealmTransformWritableSink {
211219 port . close ( ) ;
212220 } ;
213221
222+ port . unref ( ) ;
214223 }
215224
216225 start ( controller ) {
217226 this [ kState ] . controller = controller ;
218227 }
219228
220229 async write ( chunk ) {
230+ if ( this [ kState ] . unref ) {
231+ this [ kState ] . unref = false ;
232+ this [ kState ] . port . ref ( ) ;
233+ }
221234 if ( this [ kState ] . backpressurePromise === undefined ) {
222235 this [ kState ] . backpressurePromise = {
223236 promise : PromiseResolve ( ) ,
@@ -262,12 +275,12 @@ class CrossRealmTransformWritableSink {
262275}
263276
264277function 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 ) ) ;
268282
269- const promise =
270- readableStreamPipeTo ( readable , writable , false , false , false ) ;
283+ const promise = readableStreamPipeTo ( readable , writable , false , false , false ) ;
271284
272285 setPromiseHandled ( promise ) ;
273286
@@ -278,12 +291,15 @@ function newCrossRealmReadableStream(writable, port) {
278291}
279292
280293function 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 ) ) ;
284298
285299 const promise = readableStreamPipeTo ( readable , writable , false , false , false ) ;
300+
286301 setPromiseHandled ( promise ) ;
302+
287303 return {
288304 writable,
289305 promise,
0 commit comments