@@ -139,6 +139,15 @@ internal.findAcknowledgedChange = function( change ) {
139139 }
140140} ;
141141
142+ internal . requestObjectVersion = function ( id , version ) {
143+ return new Promise ( resolve => {
144+ this . once ( `version.${ id } .${ version } ` , data => {
145+ resolve ( data ) ;
146+ } ) ;
147+ this . send ( `e:${ id } .${ version } ` ) ;
148+ } ) ;
149+ } ;
150+
142151internal . applyChange = function ( change , ghost ) {
143152 var acknowledged = internal . findAcknowledgedChange . bind ( this ) ( change ) ,
144153 error ,
@@ -166,14 +175,15 @@ internal.applyChange = function( change, ghost ) {
166175
167176 if ( change . o === operation . MODIFY ) {
168177 if ( ghost && ( ghost . version !== change . sv ) ) {
169- // throw new Error( "Source version and ghost version do not match" );
178+ internal . requestObjectVersion . call ( this , change . id , change . sv ) . then ( data => {
179+ internal . applyChange . call ( this , change , { version : change . sv , data } )
180+ } ) ;
170181 return ;
171182 }
172183
173184 original = ghost . data ;
174185 patch = change . v ;
175186 modified = jsondiff . apply_object_diff ( original , patch ) ;
176-
177187 return internal . updateObjectVersion . bind ( this ) ( change . id , change . ev , modified , original , patch , acknowledged )
178188 . then ( emit ) ;
179189 } else if ( change . o === operation . REMOVE ) {
@@ -424,6 +434,7 @@ Channel.prototype.onVersion = function( data ) {
424434
425435 this . emit ( 'version' , ghost . id , ghost . version , ghost . data ) ;
426436 this . emit ( 'version.' + ghost . id , ghost . id , ghost . version , ghost . data ) ;
437+ this . emit ( 'version.' + ghost . id + '.' + ghost . version , ghost . data ) ;
427438} ;
428439
429440function NetworkQueue ( ) {
0 commit comments