@@ -168,6 +168,62 @@ function pullMessages (subscriptionName, callback) {
168168}
169169// [END pubsub_pull_messages]
170170
171+ let subscribeCounterValue = 1 ;
172+
173+ function getSubscribeCounterValue ( ) {
174+ return subscribeCounterValue ;
175+ }
176+
177+ function setSubscribeCounterValue ( value ) {
178+ subscribeCounterValue = value ;
179+ }
180+
181+ // [START pubsub_pull_ordered_messages]
182+ var outstandingMessages = { } ;
183+
184+ function pullOrderedMessages ( subscriptionName , callback ) {
185+ // References an existing subscription, e.g. "my-subscription"
186+ const subscription = pubsubClient . subscription ( subscriptionName ) ;
187+
188+ // Pulls messages. Set returnImmediately to false to block until messages are
189+ // received.
190+ subscription . pull ( { returnImmediately : true } , ( err , messages ) => {
191+ if ( err ) {
192+ callback ( err ) ;
193+ return ;
194+ }
195+
196+ // Sort messages in order of increasing messageId
197+ messages . sort ( ( a , b ) => b . messageId - a . messageId ) ;
198+
199+ // Iterate over messages in order of increasing messageId
200+ messages . forEach ( ( message ) => outstandingMessages [ message . messageId ] = message ) ;
201+
202+ const outstandingMessageIds = Object . keys ( outstandingMessages ) ;
203+ outstandingMessageIds . sort ( ) ;
204+
205+ outstandingMessageIds . forEach ( ( messageId ) => {
206+ const counter = getSubscribeCounterValue ( ) ;
207+ const message = outstandingMessages [ messageId ] ;
208+
209+ if ( messageId < counter ) {
210+ // The message has already been processed
211+ subscription . ack ( message . ackId ) ;
212+ delete outstandingMessages [ messageId ] ;
213+ } else if ( messageId === counter ) {
214+ handleMessage ( message ) ;
215+ setSubscribeCounterValue ( messageId + 1 ) ;
216+ subscription . ack ( message . ackId ) ;
217+ delete outstandingMessages [ messageId ] ;
218+ } else {
219+ // Have not yet processed the message on which this message is dependent
220+ return false ;
221+ }
222+ } ) ;
223+ } ) ;
224+ }
225+ // [END pubsub_pull_ordered_messages]
226+
171227// [START pubsub_get_subscription_policy]
172228function getSubscriptionPolicy ( subscriptionName , callback ) {
173229 // References an existing subscription, e.g. "my-subscription"
@@ -255,6 +311,7 @@ const program = module.exports = {
255311 deleteSubscription : deleteSubscription ,
256312 getSubscriptionMetadata : getSubscriptionMetadata ,
257313 pullMessages : pullMessages ,
314+ pullOrderedMessages : pullOrderedMessages ,
258315 getSubscriptionPolicy : getSubscriptionPolicy ,
259316 setSubscriptionPolicy : setSubscriptionPolicy ,
260317 testSubscriptionPermissions : testSubscriptionPermissions ,
0 commit comments