@@ -17,24 +17,34 @@ export function deconstructPacket(packet) {
1717 return { packet : pack , buffers : buffers } ;
1818}
1919
20- function _deconstructPacket ( data , buffers ) {
20+ function _deconstructPacket (
21+ data ,
22+ buffers : Array < any > ,
23+ known : object [ ] = [ ] ,
24+ retVals : WeakMap < any , object > = new WeakMap ( )
25+ ) {
2126 if ( ! data ) return data ;
2227
2328 if ( isBinary ( data ) ) {
2429 const placeholder = { _placeholder : true , num : buffers . length } ;
2530 buffers . push ( data ) ;
2631 return placeholder ;
32+ } else if ( retVals . has ( data ) ) {
33+ return retVals . get ( data ) ;
34+ } else if ( known . includes ( data ) ) {
35+ return data ;
2736 } else if ( Array . isArray ( data ) ) {
2837 const newData = new Array ( data . length ) ;
2938 for ( let i = 0 ; i < data . length ; i ++ ) {
30- newData [ i ] = _deconstructPacket ( data [ i ] , buffers ) ;
39+ newData [ i ] = _deconstructPacket ( data [ i ] , buffers , known , retVals ) ;
3140 }
3241 return newData ;
3342 } else if ( typeof data === "object" && ! ( data instanceof Date ) ) {
3443 const newData = { } ;
44+ retVals . set ( data , newData ) ;
3545 for ( const key in data ) {
3646 if ( Object . prototype . hasOwnProperty . call ( data , key ) ) {
37- newData [ key ] = _deconstructPacket ( data [ key ] , buffers ) ;
47+ newData [ key ] = _deconstructPacket ( data [ key ] , buffers , known , retVals ) ;
3848 }
3949 }
4050 return newData ;
0 commit comments