Skip to content

Instantly share code, notes, and snippets.

@vvgomes
Created May 25, 2022 17:44
Show Gist options
  • Select an option

  • Save vvgomes/675e7f0a24e89091ea469aaa0fc3070b to your computer and use it in GitHub Desktop.

Select an option

Save vvgomes/675e7f0a24e89091ea469aaa0fc3070b to your computer and use it in GitHub Desktop.
/*
A toy implementation of the Resequencer pattern from Enterprise Integration Patterns.
https://www.enterpriseintegrationpatterns.com/patterns/messaging/Resequencer.html
*/
const createResequencer = (destination) => {
const buffer = {};
let next = 1;
let last = -1;
const consume = (message) => {
addToBuffer(message);
sendSequence();
};
const addToBuffer = (message) => {
const sequenceNumber = message.sequenceNumber;
buffer[sequenceNumber] = message;
if (sequenceNumber > last) last = sequenceNumber;
};
const sendSequence = () => {
if (next > last) return;
if (!buffer[next]) return;
destination.push(buffer[next]);
next = next + 1;
sendSequence();
};
return { consume };
};
const destination = [];
const resequencer = createResequencer(destination);
const createMessage = (n) => ({
sequenceNumber: n,
payload: `Message with sequenceNumber: ${n}`
});
[2, 4, 3, 1, 7, 6, 5]
.map(createMessage)
.forEach(resequencer.consume);
console.log(destination);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment