diff --git a/src/lib/mtproto/tl_utils.ts b/src/lib/mtproto/tl_utils.ts index b10578b0..440b5fa9 100644 --- a/src/lib/mtproto/tl_utils.ts +++ b/src/lib/mtproto/tl_utils.ts @@ -634,6 +634,19 @@ class TLDeserialization { return bytes; } + + private fetchVector(type: string, field?: string) { + const len = this.readInt(field + '[count]'); + const result: any[] = new Array(len); + if(len > 0) { + const itemType = type.substr(7, type.length - 8); // for "Vector" + for(let i = 0; i < len; ++i) { + result[i] = this.fetchObject(itemType, field + '[' + i + ']'); + } + } + + return result; + } public fetchObject(type: string, field?: string): any { switch(type) { @@ -662,33 +675,8 @@ class TLDeserialization { field = field || type || 'Object'; - if(type.charAt(0).toLowerCase() === 'v' && type.substr(1, 5) === 'ector') { - if(type.charAt(0) === 'V') { - const constructorCmp = this.readInt(field + '[id]'); - - if(constructorCmp === gzipPacked) { // Gzip packed - const compressed = this.fetchBytes(field + '[packed_string]'); - const uncompressed = gzipUncompress(compressed) as Uint8Array; - const newDeserializer = new TLDeserialization(uncompressed); - - return newDeserializer.fetchObject(type, field); - } - - if(constructorCmp !== vector) { - throw new Error('Invalid vector constructor ' + constructorCmp); - } - } - - const len = this.readInt(field + '[count]'); - const result: any[] = new Array(len); - if(len > 0) { - const itemType = type.substr(7, type.length - 8); // for "Vector" - for(let i = 0; i < len; ++i) { - result[i] = this.fetchObject(itemType, field + '[' + i + ']'); - } - } - - return result; + if(type.charAt(0) === 'v' && type.substr(1, 5) === 'ector') { + return this.fetchVector(type, field); } const schema = this.mtproto ? Schema.MTProto : Schema.API; @@ -716,6 +704,10 @@ class TLDeserialization { return newDeserializer.fetchObject(type, field); } + + if(constructorCmp === vector) { + return this.fetchVector(type, field); + } let index = schema.constructorsIndex; if(!index) {