Skip to content

Commit dd053e6

Browse files
committed
remove presettled messages from outgoing buffer once transferred
1 parent 416c48d commit dd053e6

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

lib/session.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,9 @@ Outgoing.prototype.process = function() {
236236
var more = (i+1) < d.data.length;
237237
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});
238238
d.link.session.output(transfer, d.data[i]);
239+
if (d.settled) {
240+
d.remote_settled = true;//if sending presettled, it can now be cleaned up
241+
}
239242
}
240243
d.link.credit--;
241244
d.link.delivery_count++;

test/links.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -721,4 +721,40 @@ describe('miscellaneous', function() {
721721
var conn = client.connect({port: (listener.address() as any).port, id: 'client'});
722722
conn.open_receiver();
723723
});
724+
725+
it('removes presettled messages from outgoing buffer', function(done: Function) {
726+
var outgoing = [] as any;
727+
var incoming = [] as any;
728+
var sent = 0;
729+
var settled = 0;
730+
for (var i = 0; i < 10000; i++) {
731+
outgoing.push('message-' + i);
732+
}
733+
server.on('message', function (context: rhea.EventContext) {
734+
incoming.push(context.message!.body);
735+
});
736+
var conn = client.connect(listener.address() as any);
737+
var s = conn.open_sender({snd_settle_mode:1});
738+
s.on('sendable', function (context: rhea.EventContext) {
739+
if (sent === 0) {
740+
context.sender!.send({body:outgoing[sent++]});
741+
context.connection.open_sender();
742+
}
743+
});
744+
client.on('sendable', function (context: rhea.EventContext) {
745+
while (context.sender!.sendable() && sent < outgoing.length) {
746+
context.sender!.send({body:outgoing[sent++]});
747+
}
748+
});
749+
client.on('settled', function (context: rhea.EventContext) {
750+
settled++
751+
if (settled === (outgoing.length - 1)) {
752+
context.connection.close();
753+
}
754+
});
755+
client.on('connection_close', function (context: rhea.EventContext) {
756+
assert.deepEqual(incoming, outgoing);
757+
done();
758+
});
759+
});
724760
});

0 commit comments

Comments
 (0)