@@ -208,8 +208,18 @@ export class InterceptingCall implements InterceptingCallInterface {
208
208
*/
209
209
private requester : FullRequester ;
210
210
/**
211
- * Indicates that a message has been passed to the listener's onReceiveMessage
212
- * method it has not been passed to the corresponding next callback
211
+ * Indicates that metadata has been passed to the requester's start
212
+ * method but it has not been passed to the corresponding next callback
213
+ */
214
+ private processingMetadata = false ;
215
+ /**
216
+ * Message context for a pending message that is waiting for
217
+ */
218
+ private pendingMessageContext : MessageContext | null = null ;
219
+ private pendingMessage : any ;
220
+ /**
221
+ * Indicates that a message has been passed to the requester's sendMessage
222
+ * method but it has not been passed to the corresponding next callback
213
223
*/
214
224
private processingMessage = false ;
215
225
/**
@@ -242,6 +252,21 @@ export class InterceptingCall implements InterceptingCallInterface {
242
252
getPeer ( ) {
243
253
return this . nextCall . getPeer ( ) ;
244
254
}
255
+
256
+ private processPendingMessage ( ) {
257
+ if ( this . pendingMessageContext ) {
258
+ this . nextCall . sendMessageWithContext ( this . pendingMessageContext , this . pendingMessage ) ;
259
+ this . pendingMessageContext = null ;
260
+ this . pendingMessage = null ;
261
+ }
262
+ }
263
+
264
+ private processPendingHalfClose ( ) {
265
+ if ( this . pendingHalfClose ) {
266
+ this . nextCall . halfClose ( ) ;
267
+ }
268
+ }
269
+
245
270
start (
246
271
metadata : Metadata ,
247
272
interceptingListener ?: Partial < InterceptingListener >
@@ -257,7 +282,9 @@ export class InterceptingCall implements InterceptingCallInterface {
257
282
interceptingListener ?. onReceiveStatus ?. bind ( interceptingListener ) ??
258
283
( ( status ) => { } ) ,
259
284
} ;
285
+ this . processingMetadata = true ;
260
286
this . requester . start ( metadata , fullInterceptingListener , ( md , listener ) => {
287
+ this . processingMetadata = false ;
261
288
let finalInterceptingListener : InterceptingListener ;
262
289
if ( isInterceptingListener ( listener ) ) {
263
290
finalInterceptingListener = listener ;
@@ -276,16 +303,21 @@ export class InterceptingCall implements InterceptingCallInterface {
276
303
) ;
277
304
}
278
305
this . nextCall . start ( md , finalInterceptingListener ) ;
306
+ this . processPendingMessage ( ) ;
307
+ this . processPendingHalfClose ( ) ;
279
308
} ) ;
280
309
}
281
310
// eslint-disable-next-line @typescript-eslint/no-explicit-any
282
311
sendMessageWithContext ( context : MessageContext , message : any ) : void {
283
312
this . processingMessage = true ;
284
313
this . requester . sendMessage ( message , ( finalMessage ) => {
285
314
this . processingMessage = false ;
286
- this . nextCall . sendMessageWithContext ( context , finalMessage ) ;
287
- if ( this . pendingHalfClose ) {
288
- this . nextCall . halfClose ( ) ;
315
+ if ( this . processingMetadata ) {
316
+ this . pendingMessageContext = context ;
317
+ this . pendingMessage = message ;
318
+ } else {
319
+ this . nextCall . sendMessageWithContext ( context , finalMessage ) ;
320
+ this . processPendingHalfClose ( ) ;
289
321
}
290
322
} ) ;
291
323
}
@@ -298,7 +330,7 @@ export class InterceptingCall implements InterceptingCallInterface {
298
330
}
299
331
halfClose ( ) : void {
300
332
this . requester . halfClose ( ( ) => {
301
- if ( this . processingMessage ) {
333
+ if ( this . processingMetadata || this . processingMessage ) {
302
334
this . pendingHalfClose = true ;
303
335
} else {
304
336
this . nextCall . halfClose ( ) ;
0 commit comments