@@ -104,10 +104,11 @@ function InternalCloneableDOMException() {
104104InternalCloneableDOMException [ kDeserialize ] = ( ) => { } ;
105105
106106class CrossRealmTransformReadableSource {
107- constructor ( port ) {
107+ constructor ( port , unref ) {
108108 this [ kState ] = {
109109 port,
110110 controller : undefined ,
111+ unref,
111112 } ;
112113
113114 port . onmessage = ( { data } ) => {
@@ -145,13 +146,19 @@ class CrossRealmTransformReadableSource {
145146 error ) ;
146147 port . close ( ) ;
147148 } ;
149+
150+ port . unref ( ) ;
148151 }
149152
150153 start ( controller ) {
151154 this [ kState ] . controller = controller ;
152155 }
153156
154157 async pull ( ) {
158+ if ( this [ kState ] . unref ) {
159+ this [ kState ] . unref = false ;
160+ this [ kState ] . port . ref ( ) ;
161+ }
155162 this [ kState ] . port . postMessage ( { type : 'pull' } ) ;
156163 }
157164
@@ -172,11 +179,12 @@ class CrossRealmTransformReadableSource {
172179}
173180
174181class CrossRealmTransformWritableSink {
175- constructor ( port ) {
182+ constructor ( port , unref ) {
176183 this [ kState ] = {
177184 port,
178185 controller : undefined ,
179186 backpressurePromise : createDeferredPromise ( ) ,
187+ unref,
180188 } ;
181189
182190 port . onmessage = ( { data } ) => {
@@ -213,13 +221,18 @@ class CrossRealmTransformWritableSink {
213221 port . close ( ) ;
214222 } ;
215223
224+ port . unref ( ) ;
216225 }
217226
218227 start ( controller ) {
219228 this [ kState ] . controller = controller ;
220229 }
221230
222231 async write ( chunk ) {
232+ if ( this [ kState ] . unref ) {
233+ this [ kState ] . unref = false ;
234+ this [ kState ] . port . ref ( ) ;
235+ }
223236 if ( this [ kState ] . backpressurePromise === undefined ) {
224237 this [ kState ] . backpressurePromise = {
225238 promise : PromiseResolve ( ) ,
@@ -264,12 +277,12 @@ class CrossRealmTransformWritableSink {
264277}
265278
266279function 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 ) ) ;
270284
271- const promise =
272- readableStreamPipeTo ( readable , writable , false , false , false ) ;
285+ const promise = readableStreamPipeTo ( readable , writable , false , false , false ) ;
273286
274287 setPromiseHandled ( promise ) ;
275288
@@ -280,12 +293,15 @@ function newCrossRealmReadableStream(writable, port) {
280293}
281294
282295function 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 ) ) ;
286300
287301 const promise = readableStreamPipeTo ( readable , writable , false , false , false ) ;
302+
288303 setPromiseHandled ( promise ) ;
304+
289305 return {
290306 writable,
291307 promise,
0 commit comments