@@ -159,6 +159,7 @@ Outgoing.prototype.send = function (sender, tag, data, format) {
159159 'link' :sender ,
160160 'data' : fragments ,
161161 'format' :format ? format : 0 ,
162+ 'next_to_send' : 0 ,
162163 'sent' : false ,
163164 'settled' : false ,
164165 'state' : undefined ,
@@ -229,20 +230,27 @@ Outgoing.prototype.process = function() {
229230 d = this . deliveries . by_id ( this . next_pending_delivery ) ;
230231 if ( d ) {
231232 if ( d . link . has_credit ( ) ) {
232- if ( this . transfer_window ( ) >= d . data . length ) {
233- this . window -= d . data . length ;
234- for ( var i = 0 ; i < d . data . length ; i ++ ) {
233+ const num_to_send = Math . min ( this . transfer_window ( ) , d . data . length - d . next_to_send ) ;
234+ if ( num_to_send > 0 ) {
235+ this . window -= num_to_send ;
236+ const end_of_send = d . next_to_send + num_to_send ;
237+ for ( var i = d . next_to_send ; i < end_of_send ; i ++ ) {
235238 this . next_transfer_id ++ ;
236239 var more = ( i + 1 ) < d . data . length ;
237240 var transfer = frames . transfer ( { 'handle' :d . link . local . handle , 'message_format' :d . format , 'delivery_id' :d . id , 'delivery_tag' :d . tag , 'settled' :d . settled , 'more' :more } ) ;
238241 d . link . session . output ( transfer , d . data [ i ] ) ;
242+ }
243+ if ( end_of_send < d . data . length ) {
244+ d . next_to_send = end_of_send ;
245+ break ;
246+ } else {
239247 if ( d . settled ) {
240248 d . remote_settled = true ; //if sending presettled, it can now be cleaned up
241249 }
250+ d . link . credit -- ;
251+ d . link . delivery_count ++ ;
252+ this . next_pending_delivery ++ ;
242253 }
243- d . link . credit -- ;
244- d . link . delivery_count ++ ;
245- this . next_pending_delivery ++ ;
246254 } else {
247255 log . flow ( '[%s] Incoming window of peer preventing sending further transfers: remote_window=%d, remote_next_transfer_id=%d, next_transfer_id=%d' ,
248256 this . connection . options . id , this . remote_window , this . remote_next_transfer_id , this . next_transfer_id ) ;
0 commit comments