@@ -41,6 +41,11 @@ var Connection = function(spec, socket, reconnectionKey, portal, dock) {
4141 var client_id ;
4242 var protocol_version ;
4343 var waiting_for_reconnecting_timer = null ;
44+ // [{ event, data, seq, time }]
45+ // Use queue instead of array if its size is very large
46+ var message_seq = 0 ;
47+ var message_buffer = [ ] ;
48+ var message_keep_time = spec . pingInterval + spec . pingTimeout + 1 ;
4449 var pending_messages = [ ] ;
4550
4651 let reconnection = {
@@ -225,14 +230,24 @@ var Connection = function(spec, socket, reconnectionKey, portal, dock) {
225230 client_id = connectionInfo . clientId + '' ;
226231 protocol_version = connectionInfo . protocolVersion + '' ;
227232 pending_messages = connectionInfo . pendingMessages ;
233+ message_seq = connectionInfo . messageSeq ;
234+ message_buffer = connectionInfo . messageBuffer ;
228235 reconnection . enabled = true ;
229236 return client . resetConnection ( that ) ;
230237 }
231238 } ) . then ( ( ) => {
232239 let ticket = generateReconnectionTicket ( ) ;
240+ let messages = message_buffer . map ( msg => {
241+ delete msg . time ;
242+ return msg ;
243+ } ) ;
233244 state = 'connected' ;
234- safeCall ( callback , okWord ( ) , ticket ) ;
235- drainPendingMessages ( ) ;
245+ if ( protocol_version === '1.2' ) {
246+ safeCall ( callback , okWord ( ) , { ticket, messages} ) ;
247+ } else {
248+ safeCall ( callback , okWord ( ) , ticket ) ;
249+ drainPendingMessages ( ) ;
250+ }
236251 } ) . catch ( ( err ) => {
237252 state = 'initialized' ;
238253 const err_message = getErrorMessage ( err ) ;
@@ -298,6 +313,8 @@ var Connection = function(spec, socket, reconnectionKey, portal, dock) {
298313
299314 return {
300315 pendingMessages : pending_messages ,
316+ messageSeq : message_seq ,
317+ messageBuffer : message_buffer ,
301318 clientId : client_id ,
302319 protocolVersion : protocol_version ,
303320 reconnection : reconnection
@@ -315,6 +332,16 @@ var Connection = function(spec, socket, reconnectionKey, portal, dock) {
315332 } else {
316333 pending_messages . push ( { event : event , data : data } ) ;
317334 }
335+ let currentTime = process . hrtime ( ) [ 0 ] ;
336+ message_seq ++ ;
337+ message_buffer . push ( { event, data, seq : message_seq , time : currentTime } ) ;
338+ while ( message_buffer [ 0 ] ) {
339+ if ( currentTime - message_buffer [ 0 ] . time > message_keep_time ) {
340+ message_buffer . shift ( ) ;
341+ } else {
342+ break ;
343+ }
344+ }
318345 } ;
319346
320347 that . close = ( ifLeave ) => {
0 commit comments